2016-04-18 13 views
1

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?

Antwort

1

Sie müssen in Ihrem Fall keine Mehrfachvererbung verwenden. Matlabs OOP hat keine expliziten Interface-Klassen, aber wenn eine Klasse nur aus abstrakten Methoden und Eigenschaften besteht, verhält sie sich wie eine Schnittstelle. Die generische Klasse kann einen Teil dieser Schnittstelle implementieren, wobei einige abstrakte Methoden/Eigenschaften verbleiben, die von einer Unterklasse implementiert werden.

So könnte Ihre Hierarchie wie folgt aussehen:

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 
Verwandte Themen