gpt4 book ai didi

c# - 如何限制层次结构中的覆盖?

转载 作者:太空狗 更新时间:2023-10-29 19:48:53 26 4
gpt4 key购买 nike

这是一个例子,我只是好奇它是如何实现的。

我只想让 Animal 的子类能够设置它们的腿数,但我仍然希望它们能够设置自己的颜色。因此,我想在层次结构中进一步限制类,然后更改此 Legs 属性。

public abstract class Animal
{
public string Colour { get; protected set; }
public int Legs { get; protected set; }

public abstract string Speak();
}

public class Dog : Animal
{
public Dog()
{
Legs = 4;
}

public override string Speak()
{
return "Woof";
}
}

public sealed class Springer : Dog
{
public Springer()
{
Colour = "Liver and White";
}
}

public sealed class Chihuahua : Dog
{
public Chihuahua()
{
Colour = "White";
}

public override string Speak()
{
return "*annoying* YAP!";
}
}

比如我要剔除这种子类:

public sealed class Dalmatian : Dog
{
public Dalmatian()
{
Legs = 20;
Colour = "Black and White";
}
}

这将如何实现?

我知道我可以通过密封父类中函数的实现来停止子类中的覆盖。我尝试使用 Legs 属性进行此操作,但无法正常工作。

谢谢

最佳答案

在某种程度上,这违反了 OO 原则。您的父类(super class) Animal 提供了一份契约(Contract),其中包括 Legs 的设置/获取。然后,您希望子类能够限制该接口(interface)以禁止设置 Legs。由于子类化提供了一种“is-a”关系,限制接口(interface)违背了这一点,这意味着子类不会是真正的子类型,因为 set Legs 方法不存在。

我会从 Animal 中删除 Legs 属性的 setter ,因为那是一个实现细节。取而代之的是简单地有一个抽象的 setter/getter 。然后,子类可以通过返回硬编码值或使用字段来存储值来决定如何最好地实现它。

关于c# - 如何限制层次结构中的覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3344399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com