0
在C#中 - 但它可能适用于其他语言 - 在LSP的上下文中,我如何确保从另一个(可变的)继承的类不会破坏原始合同?如何确保继承类不会破坏LSP上下文中的基类合同?
例如: 如果我有public
,internal
或protected
属性setter,有一种风险,即继承类将打破原有的合同。 同样适用于virtual
方法。
如果父代和继承类的所有者不是同一个人,那么这可能会导致合同和原始开发人员的意图不足。
不变性是唯一的解决方案还是存在其他一些方法? 我倾向于认为继承对应于“行为像一个” - 关系而不是“是一个” - 关系。这是一个正确的逻辑保障吗?
下面是说明的目的的例子:
public class Foo
{
public virtual void DummyMethod(int dummyParameter)
{
if (dummyParameter > 10) { throw new ArgumentOutOfRangeException(); }
}
}
public class Bar : Foo
{
public override void DummyMethod(int dummyParameter)
{
if (dummyParameter < 0) { throw new InvalidOperationException(); }
}
}
我注意到处理这一主题(here例如),但我正在寻找一般解决方案或一些好的做法等问题,适用于避免面对这些问题提前。
你可以扩展你的意思是“行为像一个”?在相关说明中,您如何期望在实现接口时阻止课程违反合同? (同样的答案很可能适用于这种情况...) –
例如,一个正方形_是一个矩形,但是__不是表现方式相同(根据我的问题中的文章链接)。 – Guillaume
对于接口的实现,我不知道。其实我并没有真正地想到这一点,因为接口没有超出自己的签名的合同 - 至少在C#中 - 所以它由编译器执行。在一个类中,我可能会抛出一个例外的方法,但没有任何内容表明它来自外部。 – Guillaume