我正在读一本关于设计模式的书,其中有关于利斯科夫替换原则的这一章,其中说要这样做(以及其他任务)来实现该原则:
子类的方法中的参数类型应该与超类的方法中的参数类型匹配或比超类的方法中的参数类型更抽象.听起来很迷惑吧?让我们举个例子.
假设有一个类有一个应该用来喂cat 的方法:Feed(Cat C).
客户端代码始终将CAT对象传递给此方法.
Feed Good:假设您创建了一个覆盖该方法的子类,以便它可以喂养任何动物(cat 的超类):◦(Animal C).现在,如果您将这个子类的对象而不是超类的对象传递给客户端代码,一切仍然可以正常工作.这种方法可以养活所有的人 动物,所以它仍然可以喂客户经过的任何cat .
◦错误:您创建了另一个子类,并将Feed方法限制为只接受孟加拉cat 科动物(cat 科动物的一个子类):Feed(BengalCat C).如果您将客户端代码与这样的对象链接,而不是与原始类链接,客户端代码会发生什么情况?由于该方法只能喂养特定品种的cat ,因此不会为客户端传递的普通cat 提供服务, destruct 所有相关功能.
在我看来一切都很好,直到我决定try 用C#实现这个例子.
为了更好地理解示例中的"好"部分,我编写了以下代码:
public class Animal { }
public class Cat : Animal { }
public class AnimalFeeder
{
public virtual void Feed(Cat c)
{
Console.WriteLine("Feeding a cat...");
}
}
public class GenericFeeder : AnimalFeeder
{
public override void Feed(Animal a) // Compile Error - No suitable method found to override
{
Console.WriteLine("Feeding an animal...");
}
}
唯一的问题是我得到了上面的错误,
可能我误解了示例,没有编写正确的代码,
如果是,有没有人能帮我以正确的方式更正代码?
提前谢谢您!