我正在巩固我对利斯科夫替代原则和开放封闭原则之间关系的理解。如果有人能证实我的推断并回答我下面的问题,那就太好了。
我有以下课程。正如您所看到的,B是从A派生而来的,它覆盖了DisplayMessage函数以改变行为。
public class A
{
private readonly string _message;
public A(string message)
{
_message = message;
}
public virtual void DisplayMessage()
{
Console.WriteLine(_message);
}
}
public class B : A
{
public B(string message) : base(message){}
public override void DisplayMessage()
{
Console.WriteLine("I'm overwriting the expected behavior of A::DisplayMessage() and violating LSP >:-D");
}
}现在在我的bootstrap程序中,ShowClassTypeis期望一个A类型的对象,它应该有助于写出它是什么类类型。然而,B违反了LSP,所以当它的DisplayMessage函数被调用时,它会打印一条完全意想不到的消息,并且本质上干扰了ShowClassType的预期目的。
class Program
{
static void Main(string[] args)
{
A a = new A("I am A");
B b = new B("I am B");
DoStuff(b);
Console.ReadLine();
}
private static void ShowClassType(A model)
{
Console.WriteLine("What Class are you??");
model.DisplayMessage();
}
}所以我的问题是,我是否可以得出结论,ShowClassType现在违反了开放关闭原则,因为现在类型B可以进入并更改该方法的预期函数,它不再关闭以进行修改(即。为了确保它保持预期的行为,你必须改变它,让它首先检查,以确保我们只使用原始的A对象)?
或者,反过来,这只是一个很好的例子,表明ShowClassType是封闭的,可以修改,并且通过传入一个派生类型(尽管它违反了一个派生类型),我们已经扩展了它的用途?
最后,如果基类不是抽象的,那么在基类上创建虚函数是不是不好的做法?这样做,我们不是在邀请派生类违反Liskov替换原则吗?
干杯
发布于 2011-10-08 14:59:47
发布于 2012-05-10 16:02:20
我认为在这种情况下使用它并不违反not LSP和not OCP。
在我看来,ShowClassType并没有违反OCP: 1.函数不能破坏OCP,只有类架构才能做到这一点。2.您可以将新行为添加到A的派生类中,这样就不会破坏OCP
那么LSP呢?您的原因-用户不希望收到此消息?但是他得到了一些信息!如果函数覆盖返回一些消息,我认为在您的代码上下文中是可以的。如果函数是重写,则将两个数字相加,且1+1返回678it对于我来说是不可预期的,这是错误的。但是,如果对于来自火星的物理学家来说,这可能是一个很好的答案。
不要在没有所有上下文的情况下分析问题!你必须了解问题的全貌。当然,还有
https://stackoverflow.com/questions/7694345
复制相似问题