【发布时间】:2015-05-20 20:18:54
【问题描述】:
我在类层次结构中有以下设计目标:
有一个BaseClass 定义了一些属性,通常是读/写:
public class Media
{
public virtual object Content { get; set; }
public virtual double recordingLength { get; set; }
}
目的是让一些子类现在这个属性是只读的:
public class CompactDisk : Media
{
public override object Content
{
get { return this.getContent(); }
set {
// THERE SHOULDN'T BE A SETTER
}
}
public override double recordingLength
{
get { return 74; }
set {
// NO SETTER EITHER HERE!
}
}
}
我在这里迷路了,因为我不知道应该如何实现我的设计意图。
【问题讨论】:
-
你的设计意图本质上是错误的。
-
@heltonbiker 如果不是所有的媒体内容都可以设置,那么
Media不应该有内容的设置器。如果需要,让派生类添加一个setter。 -
@heltonbiker 您应该遵循 hvd 的建议。 OOP 和继承的目的是转换为父类型不应该在操作中引入任何差异。 即在这里,您尝试抑制
Media类提出的基本要求,而不是您应该使用Media类来提出基本 要求和子类可以添加更多。您可能会受益于第二个Media类MutableMedia或类似的,它继承Media并在这些属性上具有setter。 -
@heltonbiker 不是简单地覆盖属性,而是您可以通过重新引入属性(
new关键字)来实现,其中基类只读属性的 getter 和 getter对于派生类的读写属性做同样的事情。
标签: c# inheritance properties polymorphism setter