【问题标题】:Set value of Base class variable?设置基类变量的值?
【发布时间】:2012-03-06 08:32:38
【问题描述】:

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

我有一个在 Base 类中使用的 Enum,但必须在 Inheriting 类中设置。 Inheriting 类几乎没有代码,所以我特别想在方法之外执行此操作。

我想要的一个例子:

public class MyBase {
    protected myEnum;
}

public class MyClass : MyBase {
    myEnum = SomeValue;
}

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

我在这里遗漏了一些完全明显的东西吗?

【问题讨论】:

  • 尝试在构造函数或[其他]方法中分配实例变量。 (阅读错误消息,了解为什么它不喜欢上面的示例语法。)或者,使用继承类中定义的虚拟“getter”或反转它以使用事件等。使用static 可能是......不明智。
  • @pst : 解释一下这个“虚拟吸气剂”?我不想重写整个属性(这会给我 5 行代码来分配这个值。
  • 是什么让你认为你不能使用构造函数?
  • @s_hewitt :因为该类从未在我的代码中实例化。这是一个网页,所以用户只需导航到它。
  • 正确。构造函数仍会调用,ASP.NET 将如何从您的类构建页面?它必须在某个时候创建​​该类的实例。

标签: c# inheritance base-class


【解决方案1】:

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

【讨论】:

  • 此代码适用于 aspx 页面,因此这些页面不会在我的代码中实例化。因此,为什么我想要它在代码隐藏中。
  • @JamesP.Wright:您仍然可以创建构造函数;这仍然有效。
  • 例子?你是说在我的代码隐藏中我应该实例化我所在类的一个新实例,只是为了分配这个变量?
  • 只需创建构造函数。 ASP.NET 将在适当的时候使用它。
  • 哦,我想我刚刚明白了。所以我只需要public MyClass() { myEnum = SomeValue; }...我在想我需要做var myClass = new MyClass(SomeValue),等等。
【解决方案2】:

不可能分配“实例变量”,除非有(或在)一个实例 :-) [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 中做更多的工作来避免(例如,将 enumValue 包装在延迟加载 getter 本身中),但是对于“最短代码”....

编码愉快。

【讨论】:

    【解决方案3】:

    这对你有用吗?

    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
        ...
    }
    

    页面.aspx:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2012-04-27
      • 1970-01-01
      • 2013-02-28
      • 2018-02-04
      • 1970-01-01
      相关资源
      最近更新 更多