0

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

例如:如果我有public,internalprotected属性设置器,则存在继承类会破坏原始合同的风险。这同样适用于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(); }
    }
}

我注意到有关此主题的其他一些问题(例如此处),但我正在寻找通用解决方案或良好实践来避免提前面对这些问题。

4

1 回答 1

1

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

这意味着您现在根本无法从该类继承,因此您必须决定您更喜欢哪一个:消除违反 LSP 的风险或继承和修改的自由。

感谢@Hans Passant 在评论中首次提及密封。

于 2012-09-20T15:00:27.587 回答