我有以下类层次结构:
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%将覆盖它们。
但是,我希望有一个显式接口类(将接口与代码分开)。
我使用&#34;编程语言&#34;支持多重继承(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: %d\n', 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
没有错误。虽然这可行,但听起来有点“腥”和#34;对我来说。
哪种方式是合适的选择?
答案 0 :(得分:1)
在您的情况下,不需要使用多重继承。 Matlab的OOP没有显式的接口类,但如果一个类只包含抽象方法和属性,实际上它就像一个接口。泛型类可以实现该接口的一部分,留下一些方法/属性abstract,由子类实现。
所以你的层次结构看起来像这样:
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: %d\n', this.Fc);
end
end
end
classdef A < MyObject_GenericCode
properties
Fc;
end
methods
function this = A()
this.Fc = 999;
end
end
end