none
Frage zu Klassen - Variable oder Eigenschaft in abgeleiteter Klasse vordefinieren RRS feed

  • Frage

  • Ich habe jüngst den Vorzug von Klassen entdeckt und versuche eine bestehende Anwendung jetzt mit Klassen besser zu strukturieren.

    Dabei habe ich eine Basisklasse namens "GenericInstrument" definiert.

    Die indivuellen Klassen werden jeweils aus GenericInstrument abgeleitet "Inherits GenericInstrument" und dann erweitert.

    Eine ganz wesentliche Sache, die die abgeleiteten Klassen von der Basisklasse unterscheidet, ist eine EIgenschaft namens "Typcode".

    Momentan enthält die Basisklasse eine protected Variable namens _typcode.

    Diese wird in der abgeleiteten Klasse jweils in der New-Methode mit dem dazugehörigen Typcode belegt und dann später auch nicht mehr geändert.

    Ist das das korrekte Vorgehen in so einem Fall oder gibt es einen besseren/eleganteren/korrekten Weg  dies zu tun?

    Donnerstag, 28. März 2013 10:30

Antworten

  • Hallo Nico,

    ich denke die Frage dürfte sich mit der anderen erledigen.
    Einen "Unterscheider" wie einen TypeCode sollte man generell eher vermeiden.

    Brauchst Du Variablen, die von Basisklasse wie abgeleiteter verwendet werden, so wäre protected schon der richtige Weg. Es sollte aber immer nur einen Zugriffspfad geben. Anstatt zusätzlich eine Eigenschaft, sollte es gleich eine (protected) Eigenschaft sein.

    Variablen oder Eigenschaften, die nur im Konstruktor belegt werden, sollte man zudem als ReadOnly kennzeichnen.

    Gruß Elmar

    • Als Antwort markiert NicoNi Donnerstag, 28. März 2013 12:31
    Donnerstag, 28. März 2013 11:33
  • Das hilft mir schon sehr weiter.

    Allerdings ist mir die Geschichte mit dem Verzicht auf _typcode noch nicht so ganz klar.

    Ich fürchte, ich brauche doch so eine Art "Unterscheider".

    Was ich bisher noch nicht geschrieben habe: Die generische Klasse soll natürlich auch Kommandos an die Geräte schicken, z.B. "Reset".

    Es wäre also möglich

    classA.Reset(nr_des_Geraets)

    oder classB.reset(nr_des_Geraets)

    Dazu wird aus dem Typcode und einer Gerätenummer sowie dem Kommando für "Reset" ein 'Identifier' für den CAN-Bus zusammengebaut und dann die Nachricht abgeschickt.

    Entsprechend muss die generische Methode für "Reset" dann doch den Typcode wissen

    Um diese Variable geht es mir. Mit einer protrected Variable, die dann über die New-methode belegt wird geht es zumindest

    Aber ist das der richtige Weg ?

    • Als Antwort markiert NicoNi Samstag, 30. März 2013 07:54
    Donnerstag, 28. März 2013 12:31
  • Hallo Nico,

    das classA / classB Reset wird durch die andere Frage abgedeckt:

    Eine Reset wäre eine virtuelle Methode.

    Welche Variable man dann noch braucht hängt von mehreren Faktoren ab -
    die ich auf Basis der Informationen nicht vollständig beurteilen kann:
    Identifiziert classA / classB bereits das Gerät?
    Wenn jedes aktive Gerät eine Identifikationsnummer hat, so könnte dies eine Eigenschaft  der Basisklasse sein. 

    Auch die nr_des_Geraets als Parameter wäre vermutlich besser in der Klasse aufbewahrt. Für jedes Gerät solltest Du eine eigene Instanz erstellen - d. h. gibt es zwei Geräte gleichen Typs so sollte es zwei Instanzen geben.

    Gruß Elmar

    • Als Antwort markiert NicoNi Samstag, 30. März 2013 07:54
    Donnerstag, 28. März 2013 14:56

Alle Antworten

  • Hallo Nico,

    ich denke die Frage dürfte sich mit der anderen erledigen.
    Einen "Unterscheider" wie einen TypeCode sollte man generell eher vermeiden.

    Brauchst Du Variablen, die von Basisklasse wie abgeleiteter verwendet werden, so wäre protected schon der richtige Weg. Es sollte aber immer nur einen Zugriffspfad geben. Anstatt zusätzlich eine Eigenschaft, sollte es gleich eine (protected) Eigenschaft sein.

    Variablen oder Eigenschaften, die nur im Konstruktor belegt werden, sollte man zudem als ReadOnly kennzeichnen.

    Gruß Elmar

    • Als Antwort markiert NicoNi Donnerstag, 28. März 2013 12:31
    Donnerstag, 28. März 2013 11:33
  • Das hilft mir schon sehr weiter.

    Allerdings ist mir die Geschichte mit dem Verzicht auf _typcode noch nicht so ganz klar.

    Ich fürchte, ich brauche doch so eine Art "Unterscheider".

    Was ich bisher noch nicht geschrieben habe: Die generische Klasse soll natürlich auch Kommandos an die Geräte schicken, z.B. "Reset".

    Es wäre also möglich

    classA.Reset(nr_des_Geraets)

    oder classB.reset(nr_des_Geraets)

    Dazu wird aus dem Typcode und einer Gerätenummer sowie dem Kommando für "Reset" ein 'Identifier' für den CAN-Bus zusammengebaut und dann die Nachricht abgeschickt.

    Entsprechend muss die generische Methode für "Reset" dann doch den Typcode wissen

    Um diese Variable geht es mir. Mit einer protrected Variable, die dann über die New-methode belegt wird geht es zumindest

    Aber ist das der richtige Weg ?

    • Als Antwort markiert NicoNi Samstag, 30. März 2013 07:54
    Donnerstag, 28. März 2013 12:31
  • Hallo Nico,

    das classA / classB Reset wird durch die andere Frage abgedeckt:

    Eine Reset wäre eine virtuelle Methode.

    Welche Variable man dann noch braucht hängt von mehreren Faktoren ab -
    die ich auf Basis der Informationen nicht vollständig beurteilen kann:
    Identifiziert classA / classB bereits das Gerät?
    Wenn jedes aktive Gerät eine Identifikationsnummer hat, so könnte dies eine Eigenschaft  der Basisklasse sein. 

    Auch die nr_des_Geraets als Parameter wäre vermutlich besser in der Klasse aufbewahrt. Für jedes Gerät solltest Du eine eigene Instanz erstellen - d. h. gibt es zwei Geräte gleichen Typs so sollte es zwei Instanzen geben.

    Gruß Elmar

    • Als Antwort markiert NicoNi Samstag, 30. März 2013 07:54
    Donnerstag, 28. März 2013 14:56
  • okay, vielen Dank

    Ich habe die Hinweise umgesetzt - es scheint jetzt ganz gut zu funktionieren.

    Samstag, 30. März 2013 07:53