如何分离接口和通用实现

时间:2016-04-18 01:20:09

标签: matlab oop interface multiple-inheritance

我有以下类层次结构:

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;对我来说。

哪种方式是合适的选择?

1 个答案:

答案 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