如何分离接口和通用实现



我有以下类层次结构:

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

最新更新