Verfasst am: 07.09.2012, 10:04
Titel: Problem mit Programstruktur ???
Hallo an alle!
Ich muss wieder um euer Hilfe fragen, weil ich nicht weiter komme. Ich habe eine Abstarakte-Klasse definiert 'param'. In der Klasse ist eine Abstrakte-Funktion definiert 'calc'. Für jede Unterklasse wird diese überschrieben. Dann habe ich abgeleitete Klasse 'tnoise' geschrieben. Das Problem ist wenn die Funktion 'calc' als externe m-Datei abspeichere, funktioniert alles. Das will ich aber nicht, weil ich für eine andere abgeleitete Klasse die Funktion calc auch definieren möchte. Wenn ich aber die Funktion in der Klassen-Definition unter methoden einfüge, kriege ich die Fehlermeldung:
%% Get Data methode function data = get.data(obj)
data = cell(1,length(obj.sID));
for s=1:length(obj.sID)
rawdat = getdat(obj,obj.sID{s}); % function import of raw data from file
data{s} = calc(rawdat); % calculation of the value end end
%% Calc methode % real function is defined in a file function data = calc(rawdat) [lT lP] = size(rawdat);
for T = 1:lT
for P =1:lP
data.abs(T,P) = max(rawdat{T,P}) - min(rawdat{T,P});
end end end end end
%% Properties definition % Everybody can see property value but only obj intern set methode can change that % one value for this property in all instances of the class % properties hay no implementation, concrete subclass must redefine this property properties(Abstract = true, SetAccess = private, GetAccess = public)
ptyp; % Parameter typ path; % Path to the measured raw data
sID; % Sensor IDs
testseq; % Data with test profile end
%% Method definition % Abstract method definition concrete subclass must redefine this method methods(Abstract=true)
data = calc(rawdat);
end end
%% Get Data methode function data = get.data(obj)
data = cell(1,length(obj.sID));
for s=1:length(obj.sID)
rawdat = getdat(obj,obj.sID{s}); % function import of raw data from file
data{s} = calc(rawdat); % calculation of the value end end end
methods(Static)
%% Calc methode % real function is defined in a file function data = calc(rawdat) [lT lP] = size(rawdat);
for T = 1:lT
for P =1:lP
data.abs(T,P) = max(rawdat{T,P}) - min(rawdat{T,P});
end end end end end
eine Methode muss als erstes Eingabeargument immer ein Objekt des Datentyps bekommen.
Ja
Harald hat Folgendes geschrieben:
Wenn das nicht gewünscht ist, muss bei der Methode das Attribut Static gesetzt werden.
Das kann im Sinne der Polymorphie nicht funktionieren, denn eine statische Methode ist eben "statisch", d.h. einmalig innerhalb ihres Scopes. D.h. das Überladen, was der OP hier möchte funktioniert nicht. Eine statische Methode gehört zwar zu einer Klasse (was äquivalent zu einem Namespace ist), aber sie ist nicht Teil eines Objektes, eben weil sie statisch ist. Der OP möchte aber eine klassische Vererbung und damit darf die Methode nicht statisch sein, weil ich sie nicht vererben kann. Die Antwort im Sinne der OOP ist also so falsch und wird nicht funktionieren.
Also: Mach die Methode nicht statisch, dann deklariere sie als Methode Deiner abstrakten Klasse und vererbe sie. In der erbenden Klasse überlädst Du sie einfach.
Dann verweise ich noch einmal auf Haralds Antwort:
Harald hat Folgendes geschrieben:
eine Methode muss als erstes Eingabeargument immer ein Objekt des Datentyps bekommen.
Der erste Parameter einer jeden Methode ist das Objekt, d.h. wenn Du als Parameter nur varargin hast, dann überlege Dir was in varargin{1} drin steht ! Ich empfehle hier zu unterscheiden
An Harald: Vielen Dank jetzt funktioniert es
An flashpixx: Vielen Dank. Ich möchte die Methode nicht in der abgeleiteten Klasse tnoiese überladen.
Es gibt eine Superklasse 'param' dort habe ich die Methode als abstract definiert und will nun die in der Abgeleiteten Klassen 'tnoise' für alle Instanzen dieser Klasse definieren.
Es gibt eine Superklasse 'param' dort habe ich die Methode als abstract definiert und will nun die in der Abgeleiteten Klassen 'tnoise' für alle Instanzen dieser Klasse definieren.
Das nennt man aber "überladen", denn Du überlädst die abstrakt definierte Methode in der implementierten Klasse, somit ist die implementierte Methode für alle Instanzen (Objekte) Deiner abgeleiteten Klasse gültigtig
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.