У меня есть следующие иерархии классов:Как отделить интерфейс и общую реализацию
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
без ошибок. Хотя это работает, это звучит немного «подозрительно» для меня.
Какой способ является подходящим вариантом?