Domanda

Sto scrivendo alcuni software che prende di mira due versioni di hardware molto simile che, fino a quando io uso l'API per inizializzare l'hardware non sono in grado di sapere quale tipo sarò sempre indietro.

Poiché l'hardware è molto simile ho programmato di avere una classe principale (TParent) che ha alcuni metodi astratti (per cui differisce l'hardware) e poi due classi figlie (TChildA, TChildB) che attuano tali metodi in modo dipendente hardware .

Quindi, vorrei prima un'istanza di un oggetto di TParent controllare che tipo è poi gettato al bambino corretta.

Tuttavia quando faccio questo e chiamare uno dei metodi astratti pienamente implementato nella classe figlia ottengo un EAbstractError.

per esempio:

myHardware:=TParent.Create();

if myHardware.TypeA then
   myHardware:=TChildA(myHardware)
else
   myHardware:=TChildB(myHardware);

myHardware.SomeMehtod();

sto supponendo che non posso lanciare una classe genitore ad una classe figlia, e anche che probabilmente c'è un modo migliore di fare questo. Eventuali puntatori?

È stato utile?

Soluzione

Hai ragione, non si può e non dovrebbe lanciare da classe base alla classe derivata.

Sto assumendo che non si vuole avere la ri-eseguire il costruttore genitore oggetto figlio?

Se è così. . .

Rimuovi la relazione padre / figlio così com'è, si avrà una sola classe hardware. Per la specifica funzionalità Childa e ChildB, creare un nuovo modello di ereditarietà, in modo da avere un'interfaccia ISpecificHardwareTasks o classe base, e due classi derivate (SPECIFICHE & SpecificB).

quando l'hardware sta costruendo, di per sé, e si arriva al punto in cui si sa che tipo di hardware si sta lavorando con, allora crea un'istanza di SPECIFICHE o SpecificB). Questa istanza è privata di Hardware.

Hardware espone i metodi che avvolgono i metodi ISpecificHardWareTasks (si può anche implementare l'interfaccia, se questo ha un senso).

Le specifiche classi possono fare un riferimento alla classe hardware, se è necessario (anche se non so se si ha accesso al puntatore this in un costruttore, il mio Delphi sta ottenendo arrugginito)

Spero che questi sproloqui aiutato un po '.

Altri suggerimenti

È necessario un metodo di fabbrica per riportare la classe corretta a seconda del tipo di hardware che si sta utilizzando ...

function CreateHardware(isTypeA: Boolean): TParent;
begin
  if IsTypeA then Result := TChildA.Create
  else Result := TChildB.Create;
end;
...

var
  myHardware: TParent;
begin
  myHardware := CreateHardware(True);
  myHardwarde.SomeMethod;
end;

... oppure si potrebbe utilizzare i href="http://en.wikipedia.org/wiki/State_pattern" modello .

Comune in entrambi gli approcci è che la classe TParent non ha la conoscenza per determinare il tipo di knowlegde hardware.That viene trasferito nel metodo di fabbrica, chiamante del metodo di fabbrica, si fabbrica o di Stato di classe.

Grazie a binario Worrier e Mghie per avermi nella giusta direzione, in questo caso. La risposta data da Lieven sarebbe il modo più semplice nei casi in cui ridurre al minimo l'inizializzazione dell'hardware non era un problema.

L'idioma Pimpl è discusso altrove sul SO

Ecco come ho capito l'implementazione in pseudo-codice Delphi-(nota non ho disturbato con / distinzioni tra pubblico e privato per questo):

class TParent 
  procedure SomeMethod(); abstract;
end;

class TChildA (TParent)
  procedure SomeMethod(); override;
end;

class TChildB (TParent)
  procedure SomeMethod(); override;
end;

class THardware
 HardwareSpecficMethods: TParent;
 procedure SomeMethod;
 constructor Create();

contrsuctor THardware.Create();
begin
 InitializeHardware();
 If Hardware.TypeA then
  HardwareSpecificMethods:=TChildA.Create()
 else
  HardwareSpecificMethods:=TChildB.Create();
end;

procedure THardware.SomeMethod();
begin
  HardwareSpecificMethods.SomeMethod();
end;
end; {class THardware}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top