[英]C#: How can I set a maximal Value of a property from a derived class? (And not in base class)
CannibalGhost : Ghost(来自 Ghost 的 CannibalGhost dervies)
CannibalGhost
可以吃掉任何种类的幽灵,并将它们的高度加到他的高度上。 不过Ghosts
应该可以大到自己想要的高度,而CannibalGhosts
高度应该是最高50,任何情况下都无法超越。 不是通过。 set-accessor
而不是通过构造函数。
到目前为止我已经尝试过:
覆盖Constructor
:
不能覆盖构造函数
在Set-Accessor
实现 if( height >= 50
)
如果我在Main-Program
使用构造函数创建对象,则不起作用
在主代码中实现一个障碍,所以高度永远不会超过 50
如果我稍后想要CannibalGhost
新对象(并且是一团糟),则不起作用
编写它以便CannibalGhost
不是从Ghost
派生的
所以我可以编写一个新的构造函数和set-Accessor
的上限为 50。它起作用了,但我希望CannibalGhosts
也是一个 Ghost(源自 Ghost)
总结:如何将CannibalGhost
的属性Height
设置为最大 50,但不在基类Ghost
?
您可以以这样一种方式构建Ghost
,即它知道派生类中需要一些验证,而无需在基类中实现逻辑本身
public class Ghost
{
private int height;
protected virtual bool IsValidHeight(int newHeight)
{
return true;
}
public int Height
{
get{ return height; }
set
{
if(!IsValidHeight(value) throw new InvalidHeightException(value);
height = value;
}
}
}
public class CannibalGhost
{
protected override bool IsValidHeight(int newHeight
{
return newHeight <= 50;
}
}
也许不是抛出异常,而是要限制可以创建该虚拟方法的高度
protected virtual int LimitHeight(int newHeight)
{
return newHeight;
}
和
protected override int LimitHeight(int newHeight)
{
return (int)Math.Min(newHeight,50);
}
那么二传手就是
set
{
height = LimitHeight(value);
}
这对Ghost
没有影响,但会将派生的CannibalGhost
限制为 50。
事实上,这不是一个很好的解决方案。 在设计基类时,您无法知道所有可能需要进行此类验证的地方——这也是比这个简单示例更复杂的解决方案无法实现继承的原因。
CannibalGhost
真的和Ghost
有is-a
关系吗? 或者它实际上是由多个Ghost
实例组成的( has-a-collection-of
关系)。 在这种情况下,它的高度可能只是其所有组成的Ghost
实例的总和,限制为 50。不需要继承。 也许所有的幽灵IGhost
为共享行为实现了IGhost
- 需要考虑的事情!
通过在基类中将 Height 属性virtual
,您可以让派生类通过覆盖它来实现更具体的行为。
例子:
public class Ghost
{
public virtual int Height { get; set; }
}
public class CannibalGhost : Ghost
{
private int _height;
public override int Height
{
get
{
return _height;
}
set
{
if (value > 50)
throw new InvalidOperationException($"A {nameof(CannibalGhost)} cannot have a height over 50");
_height = value;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.