gre*_*man 6 c# inheritance properties
我有一个带有属性Value的抽象基类A,以及两个派生类W和R.总是可以读取Value(并且方法总是相同的 - 读取存储的值),所以我将getter直接放到A .
但是写入Value并不总是可行,因此有W和R.W也提供了一个setter,而R没有 - 它只依赖于来自A的特性.
问题是,无论我尝试什么,我都无法在C#中实现这样的设计.我不能覆盖W中的Value属性,因为基类中没有setter(并且没有,因为向基类添加setter意味着它也会"泄漏"到R).
我在A中添加了一个引发异常的setter.在WI覆盖设置器中,在RI中什么都不做.
这是丑陋的,因为设计,因为R中的setter是公共的,因为现在这样的代码编译:
R reader;
reader.Value = 5;
Run Code Online (Sandbox Code Playgroud)
那么如何在基类中创建一个只有getter的属性,并在派生类中添加一个setter?
因为总有至少一个好奇的灵魂,我解释 - 这些类是数据持有者/经理.R类是动态数据"持有者" - 它使用给定的公式计算值(类似于Lazy Eval类).大多数东西在W和R中很常见 - 过滤值,发送通知等等.唯一的区别是在R中你不能直接设置值,因为公式是单向的(类似于WPF转换器只有一个方法定义,转换).
感谢Marc我解决了这个问题,这里是代码:
abstract class A {
public int Value { get { return ... } }
}
class R : A { }
class W : A {
new public int Value {
get { return base.Value; }
set { .... }
}
}
Run Code Online (Sandbox Code Playgroud)
与Marc版本的不同之处在于缺少基类中的setter(这是问题的全部要点),与我的解决方法的区别在于隐藏属性,而不是覆盖它.小而重要的一块.
谢谢Marc的启示:-).
abstract class A {
public int Value {get; protected set;}
}
class R : A { }
class W : A {
new public int Value {
get { return base.Value; }
set { base.Value = value; }
}
}
Run Code Online (Sandbox Code Playgroud)