我有这样的代码:正在缩小的重写方法参数类型Liskov替换原则违反?
abstract class Entity
{
// blah-blah-blah
}
abstract class BaseCollection
{
public void add(Entity entity);
}
而且我从实体和BaseCollection类派生:
class User extends Entity
{
}
class UserCollection extends BaseCollection
{
public void add(User user) { // blah-blah-blah }
}
这是里氏替换原则违反的例子吗?如果是这样,我该如何解决这个问题?
感谢您的回答。 根据我的经验,当需要使overriden方法的参数类型变窄时,经常会出现这种情况。但是这违反了LSP。 那么我该如何解决这个问题呢? – 2012-04-19 19:05:13
如果你发现自己违反了LSP,那意味着你并没有真正的关系,所以继承不是正确的选择。考虑构图,某种模板/泛型解决方案或仅仅是两个非相关的类而不是 – Attila 2012-04-20 13:53:38
好,但有时您需要模拟一些真实的生活情况。 例如,有'呼叫(博士医生)'方法的类'人'''。而'Child'类扩展了'Human'。但是'孩子'不能接受任何医生。他只需要'延伸'医生'的儿科医生。所以'孩子'这样覆盖方法:'打电话(儿科医生)'。 “孩子”显然与“人”有“关系”。但是,这个类模型违反了LSP。如何克服违规? – 2012-04-21 18:43:00