ich die folgende Klassenhierarchie:Wie Schnittstelle trennen und gemeinsame Umsetzung
IMyObject % common interface defining methods and properties (abstract properties are supported by MATLAB)
A < IMyObject
B < IMyObject
...
IMyObject
sollte als Schnittstelle fungieren, und wenn möglich, nicht-Code enthält.
Es gibt viele Klassen (A, B, ...), abgeleitet von IMyObject und 90% dieser Codes für bestimmte Methoden.
Der direkte Weg besteht darin, eine abstrakte Klasse anstelle einer Schnittstelle zu verwenden und einfach diesen ganzen Code in IMyObject zu definieren (möglicherweise in MyObjectRoot, MyObjectMaster, AbstractMyObject o.ä. umzubenennen). Die 10%, die den Code der erwähnten Methoden nicht teilen, würden sie überschreiben.
Allerdings hätte ich gerne eine explizite Interface-Klasse (um die Schnittstelle vom Code zu trennen).
Ich verwende eine "Programmiersprache", die mehrere Vererbung (MATLAB) unterstützt.
Jetzt kann ich den Ansatz verwenden, um eine Klasse MyObject_GenericCode
zu erstellen, und die 90% -Klassen würden nicht nur von IMyObject
sondern auch von der MyObject_Generic
Klasse erben.
Da diese generische Klasse Zugriff auf die Daten benötigt (die abstrakten Eigenschaften von IMyObject
), müssten sie auch daraus abgeleitet werden.
Beispiel:
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
Das Problem ist der Diamant Problem - aber es ist in diesem Fall theoretisch, weil ich es denke nicht, solche Fälle wäre.
Abgesehen davon - gibt es etwas Entmutigendes dabei?
Schließlich habe ich herausgefunden, dass ich dies in MATLAB vermeiden kann, weil die generischen Code-Klassen nicht von IMyObject geerbt werden müssen, aber immer noch auf die Eigenschaften aus dem bereitgestellten Objekt zugreifen können.
Beispiel:
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();
die zurück
Value of Fc: 999
ohne Fehler. Obwohl das funktioniert, klingt es für mich ein bisschen "fischig".
Welcher Weg ist die geeignete Option?