设置基类变量的值

本文关键字:类变量 基类 设置 | 更新日期: 2023-09-27 18:24:29

这可能是一个非常愚蠢的问题,让人觉得我的大脑已经消失了。。。但我无法理解如何从基类中设置受保护的或公共的变量。

我有一个枚举,它在基类中使用,但必须在继承类中设置。Inheriting类几乎没有代码,所以我特别想在方法之外完成这项工作。

我想要的一个例子:

public class MyBase {
    protected myEnum;
}
public class MyClass : MyBase {
    myEnum = SomeValue;
}

如果我用get/set将myEnum设置为一个属性,我可以覆盖它……但最终我会得到更多的代码行
如果我重写Page_Load,我可以访问this.myEnum,但同样,我希望在方法之外访问它,因为它是Inheriting类中唯一的代码。

我是不是错过了一些显而易见的东西?

设置基类变量的值

您需要创建一个构造函数
不能在方法之外执行代码。

除非有(或在)实例,否则不可能分配"实例变量":-)[C#确实允许对当前类定义和声明中分配的值中定义的字段使用一些编译器魔法;这不会扩展到任意分配。]

虽然我个人会使用派生类的构造函数(或保证在适当时间运行的方法),但可以用来反转这一点的一种方法是使用虚拟getter:

请注意,本例访问构造函数中的虚拟方法(请参阅在基类构造函数中调用虚拟方法),这需要小心:(派生类可能处于"无效状态",因为它的构造函数主体尚未运行。)

class Base {
    protected virtual MyEnum DefaultEnumValue { get { return 0; } }
    MyEnum enumValue;
    Base () {
        enumValue = DefaultEnumValue;
    }
}
class Derived : Base {
    protected override MyEnum DefaultEnumValue { get { return MyEnum.Derived; } }
}

再次,请注意对虚拟方法的调用,这可以通过在Base中多做一点工作来避免(例如,将enumValue包装在懒惰加载getter本身中),但对于"最短代码"。。。。

快乐的编码。

这对你有用吗?

BasePage.cs(BasePage,源自Page):

class BasePage : Page
{
    ...
    private MyEnum _myenum;
    ...
    protected MyEnum EnumProperty
    {
        get { return _myenum; }
        set { _myenum = value; }
    }
}

Page.aspx。cs(源自BasePage):

class _Page : BasePage
{
    // Nothing here for this
    ...
}

Page.aspx:

<%@Page ... Inherits="_Page" %>
...
<script runat="server">base.EnumProperty = MyEnum.Value;</script>
<html>
...
</html>