繁体   English   中英

C#:如何从派生类设置属性的最大值? (而不是在基类中)

[英]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真的Ghostis-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM