首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Liskov和OCP之间的关系

理解Liskov和OCP之间的关系
EN

Stack Overflow用户
提问于 2011-10-08 10:09:15
回答 2查看 1.5K关注 0票数 2

我正在巩固我对利斯科夫替代原则和开放封闭原则之间关系的理解。如果有人能证实我的推断并回答我下面的问题,那就太好了。

我有以下课程。正如您所看到的,B是从A派生而来的,它覆盖了DisplayMessage函数以改变行为。

代码语言:javascript
复制
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的预期目的。

代码语言:javascript
复制
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替换原则吗?

干杯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-08 14:59:47

我要说的是,并不是ShowClassType违反了开放/关闭原则。只有B类违反了Liskov替换原则。A对扩展开放,但对修改关闭。来自Wikipedia

实体可以允许在不改变其源代码的情况下修改其行为。

很明显,A的源代码没有被修改。也没有使用A的私有成员(这也违反了我书中的Open/Closed原则)。B严格使用A的公共接口,因此尽管遵循Open/Closed原则,但违反了Liskov替换原则。

最后一个问题本身就值得讨论。SO上的相关question在这里。

票数 0
EN

Stack Overflow用户

发布于 2012-05-10 16:02:20

我认为在这种情况下使用它并不违反not LSP和not OCP。

在我看来,ShowClassType并没有违反OCP: 1.函数不能破坏OCP,只有类架构才能做到这一点。2.您可以将新行为添加到A的派生类中,这样就不会破坏OCP

那么LSP呢?您的原因-用户不希望收到此消息?但是他得到了一些信息!如果函数覆盖返回一些消息,我认为在您的代码上下文中是可以的。如果函数是重写,则将两个数字相加,且1+1返回678it对于我来说是不可预期的,这是错误的。但是,如果对于来自火星的物理学家来说,这可能是一个很好的答案。

不要在没有所有上下文的情况下分析问题!你必须了解问题的全貌。当然,还有

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7694345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档