c# - 从子类提供抽象类成员变量

标签 c# .net oop abstract-class

从具体子类向抽象类提供值的“正确”方法是什么?

即,我应该这样做吗:

abstract class A {
    private string m_Value;

    protected A(string value) {
        m_Value = value;
    }

    public string Value {
        get { return m_Value; }
    }
}

class B : A {
    B() : this("string value") {}
}

或者这个:

abstract class A {

    protected A() { }

    public abstract string Value { get; }
}

class B : A {
    B() {}

    public override string Value {
        get { return "string value"; }
    }
}

还是别的?

如果 Value 属性只用在抽象类中,应该做不同的事情吗?

最佳答案

我通常更喜欢第一种方法,因为它在子类中需要的代码更少。

但是,我承认第二种方法的语义在某种程度上更清晰。覆盖属性表示“此属性的实现是我的身份的一部分。”传递构造函数参数具有不同的含义:“我正在为另一个东西设置一个值,它恰好是我的基类。”它意味着组合 (has-a) 而不是继承 (is-a)。

And should different things be done if the Value property is only used in the abstract class?

在这种情况下,您绝对应该使用第一种(面向构造函数的)方法,这样您就可以对子类隐藏该实现细节。

同样,如果你需要在构造函数中使用该值;作为Marc mentioned这是使用第一种方法的实际技术原因。虽然在这种特定情况下这无关紧要,但如果有人稍后修改属性覆盖以使用派生类中的某些其他成员变量,您可能会遇到一个微妙的错误。

关于c# - 从子类提供抽象类成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1674954/

相关文章:

oop - 如何避免 getter 和 setter

c# - 创建自定义 DataGrid 的 ItemsSource

c# - LiteDB:字段 'Null' 上的 BSON 数据类型 '_id' 无效

c# - 仅使用新记录进行更新时,DataTable.Load 方法不起作用

.net - 将 MVC 应用程序作为独立应用程序运行

c++ - 有没有办法避免在特定的自定义类继承结构中使用虚拟方法?

javascript - 返回的事件对象覆盖父对象 - javascript、easeljs

c# - FileInfo.OpenRead() - 它使用什么类型的编码?

.net - 如何向我的 C++ 项目添加计时器?

c# - 使用 XPath 测试当前节点