设置Base类变量的值?

时间:2012-02-14 23:47:07

标签: c# inheritance base-class

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

我有一个在Base类中使用的Enum,但必须在Inheriting类中设置。继承类几乎没有代码,所以我特别想在方法之外做这个。

我想要的一个例子:

public class MyBase {
    protected myEnum;
}

public class MyClass : MyBase {
    myEnum = SomeValue;
}

如果我将myEnum设置为带有get / set的属性,我可以覆盖它......但最后我会得到更多的代码行。
如果我覆盖Page_Load,我可以访问this.myEnum,但我想再次访问它,因为它是Inheriting类中唯一的代码。

我错过了一些完全明显的东西吗?

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

除非一个实例具有(或在其中),否则无法分配“实例变量”:-) [C#允许某些编译器魔术用于当前类定义中定义的字段声明中指定的值;这不会扩展到任意分配。]

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

请注意此示例访问构造函数中的虚拟方法(请参阅Calling virtual method in base class constructor),这需要谨慎处理:(派生类可能处于“无效状态”)因为它的构造函数体已经运行了。)

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中的更多工作来避免(例如在lazy-load getter本身中包装enumValue),但是为“最短的代码”....

快乐的编码。

答案 2 :(得分:-1)

这对你有用吗?

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>