这可能是一个非常愚蠢的问题,让我觉得我的大脑已经消失......但我无法理解如何从Base类设置受保护或公共变量。
我有一个在Base类中使用的Enum,但必须在Inheriting类中设置。继承类几乎没有代码,所以我特别想在方法之外做这个。
我想要的一个例子:
public class MyBase {
protected myEnum;
}
public class MyClass : MyBase {
myEnum = SomeValue;
}
如果我将myEnum设置为带有get / set的属性,我可以覆盖它......但最后我会得到更多的代码行。
如果我覆盖Page_Load,我可以访问this.myEnum
,但我想再次访问它,因为它是Inheriting类中唯一的代码。
我错过了一些完全明显的东西吗?
答案 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>