2009-10-05 53 views
2

如果我有像SOLID里氏替换原则

class square : figure {} 

class triangle : figure {} 

这是否意味着我永远也不会用方形和三角形类,但只涉及数字呢?

从来没有像这样做:

var x = new square(); 

回答

6

在你的情况下,LSP将意味着所有的行为从figure继承应该是适合于squaretriangle。所以你不会想要figure.Side1,Side2Side3的setter,因为那些对square没有意义。

在某些时候,您必须参考squaretriangle,但只有在您正在做的事情是特定于子类的情况下。如果您正在实施适用于所有数字(可能是Draw方法)的行为,那么它应该接受figure参数,而不是squaretriangle

举个例子,你的类可以被设置如下:

abstract class figure 
{ 
    abstract void draw(); 
} 

class triangle : figure 
{ 
    void draw() 
    { 
     // ... 
    } 
} 

class drawer 
{ 
    void call_draw(figure fig) 
    { 
     fig.draw(); 
    } 
} 

只要figure.draw()是虚拟的,这意味着它的实现可以(或必须)由子类重写,可以执行triangle“即使该对象正被用作figure,也会出现这种情况。

+0

如果你不知道这是一个三角形,你将如何绘制三角形 – Omu 2009-10-06 05:28:38

+6

你让它绘制自己。 – wds 2009-10-06 09:46:22

+2

而不是“绘图”(它调用GDI的概念或棘手的事情)想想所有图中都存在的GetArea()或GetPerimeter()。 非常关键的一点是Keith的第一段,他谈到了Side1和Side1,这对Square没有意义。或者考虑一个没有双方的圈子。如果圆从图继承。 var myCircle = new Circle(); myCircle.Side1 = xx; <====在现实世界中没有任何意义 – user152800 2010-06-08 00:26:06

2

你必须定义squaretriangle类和实现他们的方法 - 你必须能够建立他们,因为你已经表明:

var x = new square(); 

大多数,如果不是的square所有其他的用途和triangle应该是通过基类figure.

至于LSP,这是指在其中采取figure作为参数其他类的其它方法:

other_method(figure fig); 

这种方法应该是高兴的工作,无论是在事实上squaretriangle实例被传递给它,它不应该尝试发现为了工作实际的类。