2016-04-18 3 views
1

У меня есть следующие иерархии классов:Как отделить интерфейс и общую реализацию

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: %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 

без ошибок. Хотя это работает, это звучит немного «подозрительно» для меня.

Какой способ является подходящим вариантом?

ответ

1

Нет необходимости использовать множественное наследование в вашем случае. В OOP от Matlab нет явных классов интерфейса, но если класс состоит только из абстрактных методов и свойств, то он действует как интерфейс. Общий класс может реализовать часть этого интерфейса, оставив некоторые абстрактные методы/свойства, которые будут реализованы подклассом.

Так иерархия может выглядеть следующим образом:

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 
Смежные вопросы