我有以下类层次结构:
IMyObject % common interface defining methods and properties (abstract properties are supported by MATLAB)
A < IMyObject
B < IMyObject
...
IMyObject
应充当接口,如果可能,则不包含代码。
有许多类(A、B…)派生自IMyObject,其中90%共享某些方法的代码。
直接的方法是使用抽象类而不是接口,并在IMyObject中定义所有这些代码(可能将其重命名为MyObjectRoot、MyObjectMaster、AbstractMyObject或类似的代码)。不共享上述方法代码的10%将覆盖它们。
但是,我希望有一个显式接口类(将接口与代码分离)。
我使用一种支持多重继承的"编程语言"(MATLAB)。
现在我可以使用该方法创建一个类MyObject_GenericCode
,并且90%的类不仅从IMyObject
继承,而且从MyObject_Generic
继承。
由于这个泛型类需要访问数据(来自IMyObject
的抽象属性),因此它们也需要从中派生
示例:
MyObject_GenericCode < IMyObject
...
% the 90% classes having some kind of common code:
A < IMyObject & MyObject_GenericCode
B < IMyObject & MyObject_GenericCode
....
% 10% just use the interface and implement everything ob their own
Z < IMyObject
问题是钻石问题,但在这种情况下,它更具理论性,因为我认为不会有这样的情况。
除此之外,还有什么令人沮丧的吗?
最后,我发现在MATLAB中我可以避免这种情况,因为泛型代码类不需要从IMyObject继承,但仍然可以访问所提供对象的属性。
示例:
classdef IMyObject
properties (Abstract)
Fc;
end
methods (Abstract)
test(this);
end
end
classdef MyObject_GenericCode
methods
function test(this)
fprintf(1, 'Value of Fc: %dn', this.Fc);
end
end
end
classdef A < IMyObject & MyObject_GenericCode
properties
Fc;
end
methods
function this = A()
this.Fc = 999;
end
end
end
myObj = A();
myObj.test();
返回
Value of Fc: 999
没有错误。虽然这很有效,但对我来说听起来有点"可疑"
哪种方式是合适的选择?
在您的案例中不需要使用多重继承。Matlab的OOP没有显式接口类,但如果一个类只由抽象方法和属性组成,那么它实际上就像一个接口。泛型类可以实现该接口的一部分,留下一些抽象的方法/属性,由子类实现。
所以你的层次结构可能是这样的:
classdef IMyObject
properties (Abstract)
Fc;
end
methods (Abstract)
test(this);
end
end
classdef MyObject_GenericCode < IMyObject
properties (Abstract)
Fc;
end
methods
function test(this)
fprintf(1, 'Value of Fc: %dn', this.Fc);
end
end
end
classdef A < MyObject_GenericCode
properties
Fc;
end
methods
function this = A()
this.Fc = 999;
end
end
end