定义并行继承的具体例子



在阅读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上,这种情况下经常出现的语法问题是,我如何确保我的动物不吃错误的食物?

最新更新