在 C# 中 - 但它可能适用于其他语言 - 在LSP的上下文中,我如何确保从另一个(可变)继承的类不会违反原始合同?
例如:如果我有public
,internal
或protected
属性设置器,则存在继承类会破坏原始合同的风险。这同样适用于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(); }
}
}
我注意到有关此主题的其他一些问题(例如此处),但我正在寻找通用解决方案或良好实践来避免提前面对这些问题。