最有效的方法是从基类继承几个属性。例如:我有一个继承图的Figure类和Circle和Rectangle类。在图类中,我已经实现了三个属性width,height和radius。我可以看到它们是虚拟的,所以我可以覆盖它们。但这是最好的方法吗?有没有其他方式,例如接口?
答案 0 :(得分:2)
当您必须仅从基类继承一些属性时会出现问题。这意味着班级有太多的工作。你可以坚持使用接口图,在这里你可以为Circle和Rectangle设置所有常用方法,并在这些类中实现它。宽度和高度也只属于Rectangle,而radius只属于Circle
通过做你刚刚写的内容,你不应用一个众所周知的原则: Liskov替换原则 Wikipedia article
如果S是T的子类型,则程序中类型T的对象可以是 用S型物体代替,而不改变任何理想的物体 该程序的属性
答案 1 :(得分:0)
使用接口,您无法继承任何行为。它只是要求您在实现该接口的类中实现该行为。您可以实现多个接口,但它可以作为合同而不是基础实现。如果您有实际的共享实现,基类更适合。您只能使用c#中的一个基类。
答案 2 :(得分:0)
在一个Figure类中,我已经实现了三个属性width,height和radius。
那时你已经错过了继承点。在基类中定义这些东西意味着所有派生类都具有所有这些东西。什么样的形状有宽度,高度和半径?
基类应该只定义所有派生类中通用的东西。它应该不定义可能在任何给定派生类上的所有内容。这导致了一个单一的catch-all基类,它试图成为一切,同时无法准确地成为任何东西。
可以在公共多边形基类上的属性示例可以是:
暂时考虑Area
。抽象基类将此属性定义为抽象,因为它不知道派生类计算区域的维度。它只知道,作为一个多边形,它将有一个区域。
任何给定的派生类都会在内部知道如何计算其面积,并将实现该属性。例如,矩形知道使用其宽度和高度来进行此计算。抽象基本多边形不知道宽度或高度,因此它只保留区域的抽象占位符。
因此,无论如何计算该区域,只需要知道多边形区域的任何操作都可以传递从该基本多边形类继承的任何对象。衍生成员是什么并不重要,任何多边形都可以工作。但是,如果操作依赖于"宽度"那么它需要一种特定的派生对象,而不仅仅是任何基础多边形。
继承是" X 是 Y"的关系。如果X派生自Y.也就是说,如果Rectangle
派生自Polygon
,则矩形是多边形。但是,并非每个多边形都是矩形。因此Polygon
无法定义Rectangle
的属性,因为其他多边形无法知道如何处理这些属性。
通常,一种明智的方法是开始构建派生对象,然后在适当的时候重构为公共基础对象,而不是尝试定义通用的catch-all基类,然后查看可以使用哪种派生类使健康。有许多refactoring patterns可以帮助解决这个问题,它解决了从多个类中识别和提取常见功能到公共基类的方法。