Inheritance 多重继承-避免钻石问题?

Inheritance 多重继承-避免钻石问题?,inheritance,multiple-inheritance,diamond-problem,Inheritance,Multiple Inheritance,Diamond Problem,我经常想到这一点:我有一个由类B扩展的类a,然后有一些类派生自类a或同时派生自多重继承 示例:我有一个表示数学模型的对象,它定义了一个接口IModel来应用它并找到它的系数 在此基础上,推导了多项式模型,定义了一大类多项式模型 另一方面,我定义了第三个接口IAdaptiveModel,它定义了诸如+和-之类的操作符来自适应地创建模型。对于多项式模型,这将增加它们的系数。另一方面,对于神经网络来说,这是没有意义的 IAdaptiveModel现在是否应该从IModel派生,从而导致钻石问题,还是应

我经常想到这一点:我有一个由类B扩展的类a,然后有一些类派生自类a或同时派生自多重继承

示例:我有一个表示数学模型的对象,它定义了一个接口IModel来应用它并找到它的系数

在此基础上,推导了多项式模型,定义了一大类多项式模型

另一方面,我定义了第三个接口IAdaptiveModel,它定义了诸如+和-之类的操作符来自适应地创建模型。对于多项式模型,这将增加它们的系数。另一方面,对于神经网络来说,这是没有意义的

IAdaptiveModel现在是否应该从IModel派生,从而导致钻石问题,还是应该避免这种情况

优点:当我对IAdaptiveModel进行运行时检查时,我可以确定它也是一个应该是的IModel。 缺点:例如,多项式模型将继承IModel两次

问题的目标不是特定的编程语言,但这里有一个伪代码:

classdef IModel
    methods (Abstract)
        y = apply(obj, x);
        obj = solve(obj, x, y);
    end
end

classdef IAdaptiveModel % should this derive from IModel ??
    methods (Abstract)
        obj = plus(obj, other);
        obj = minus(obj, other);
    end
end

% derives from IModel and can be used by objects requiring apply/solve
% derives from IAdaptiveModel to be used from adaptive algorithms which use plus/minus
classdef PolyModel < IBehavioralModel & IAdaptiveModel
    [...]
end

% in a different piece of code in an adaptive algorithm I would have
if isa(modelObject,'IAdaptiveModel')
    % technically this could fail because solve does not need to be implemented when IAdaptiveModel does not derive from IModel
    modelObject = modelObject.solve(x,y);
    modelObject = modelObject + const * deltaModel;
else
    error('We require an object that supports IAdaptiveModel');
end

你能展示一些代码并告诉我你用的是什么语言吗?它不是针对某一种语言的——这是一个概念性的OOP问题。我仍然添加了代码,从中应该可以清楚地看到。我相信您的IAdaptiveModal和IModal是接口。如果你使用接口,我看不出你会遇到钻石问题。是的,在这种情况下,它们是接口。但我也会遇到一些情况,但事实并非如此。然后是另一个例子:信号类定义并实现采样信号的通用函数。由此导出带限信号。我还从它和RandomSignal ComplexRandomSignal推导出RandomSignal。BandlimitedComplexRandomSignal类将从BandlimitedSignal和ComplexRandomSignal派生,因此隐式地从第一个信号类派生两次。如果这是一种糟糕的编码风格,那么问题更大,应该避免。