在阅读Alexander Shvets的Dive Into Design Patterns时,我在" prefer Composition胜过inheritance "一节中偶然发现了以下语句:
试图通过继承重用代码可能导致创建并行继承层次
根据这个网站的定义,并行继承是指子类化一个类需要在其他地方创建另一个子类的情况。我很想知道什么是这种情况,我们必须在所有的地方创建子类,进一步的为什么:为什么我们必须在其他地方创建子类?这种需求是由上下文和我们试图解决的问题引起的,还是由(至少)两个类层次结构的结构和它们之间的组合引起的?虽然这里试图给出并行继承的数学定义,但我不清楚是否需要暗示。
我是这样理解的。假设你有
public abstract class CarBase
{
// all cars run on liquid fuel, right? This is 1955
public decimal FuelVolume { get; set; }
}
然后继承这个并创建PUTruck
,SportsCar
,Sedan
等
突然,现在是2022年,你有了电动汽车。你可能会做
public abstract class ElectricCarBase : CarBase
{
public decimal ChargeVolume { get; set; }
}
^^这将伴随着所有未使用和不需要的属性,一堆噪音,如防冻液和燃料管道的肮脏。最后是并行继承。您将需要创建所有类型的适配器来支持所有这些。
输入"组合优于继承">
public abstract class CarBase
{
public List<IFuelProvider> FuelSources { get; set; }
}
public interface IFuelProvider
{
public FuelType TypeOfFuel { get; set; }
public string MeasureUnit { get; set; }
public int FuelUnits { get; set; }
}
现在,您可以支持燃气,电动或混合动力
这是我的理解。欢迎提出不同意见
说到继承,我们似乎总能从动物王国中找到例子。所以我们有这样的Animal
类层次结构。
interface Animal {
void eat(Food someFood);
}
但是每个Animal
都有自己特殊的Food
。因此,当我们用Dog
子类化Animal
时,我们需要用DogFood
子类化Food
;当我们用Cat
子类化Animal
时,我们需要用CatFood
子类化Food
,以此类推。
并行层次结构可以自然地出现在问题领域中,在这种情况下,在代码中以相同的方式对它们进行建模可能是明智的。但是,并行层次结构也可能在解决方案域中人为地出现,而这种冗长可能是不希望看到的。
在StackOverflow上,这种情况下经常出现的语法问题是,我如何确保我的动物不吃错误的食物?