2012-09-09 13 views
0

在C#中 - 但它可能适用于其他语言 - 在LSP的上下文中,我如何确保从另一个(可变的)继承的类不会破坏原始合同?如何确保继承类不会破坏LSP上下文中的基类合同?

例如: 如果我有publicinternalprotected属性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例如),但我正在寻找一般解决方案或一些好的做法等问题,适用于避免面对这些问题提前。

+1

你可以扩展你的意思是“行为像一个”?在相关说明中,您如何期望在实现接口时阻止课程违反合同? (同样的答案很可能适用于这种情况...) –

+0

例如,一个正方形_是一个矩形,但是__不是表现方式相同(根据我的问题中的文章链接)。 – Guillaume

+0

对于接口的实现,我不知道。其实我并没有真正地想到这一点,因为接口没有超出自己的签名的合同 - 至少在C#中 - 所以它由编译器执行。在一个类中,我可能会抛出一个例外的方法,但没有任何内容表明它来自外部。 – Guillaume

回答

1

您可以使用sealed关键字来防止违反LSP。

这意味着你现在不能继承这个类,所以你必须决定你喜欢哪一个:消除违反LSP的风险或者继承和修改的自由。

请将@Hans Passant归于评论中的第一封提及。