mikrocontroller.net

Forum: PC-Programmierung C#: Frage zu geerbte Klassen


Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

vielleicht kann mir jemand bei dem nächsten Problem helfen:

- Ich habe einen Interface I
- Eine Klasse USB von I geerbt
- Eine Klasse RS232 von I geerbt
- Und eine Klasse Comm von I geerbt
- In Comm sind zwei Instanzen von USB (myUSB) und RS232(myRS232)

Wie kann ich es implementieren dass wenn der User seine Schnittstelle 
wählt nur mit dem Interface von einer der Instanzenen arbeite?

In "C++" hätte ich in der Klasse Comm noch eine "void* myInterface" und 
wenn der User sein USB-Interface gewählt hat: myInterface = 
(void*)myUSB;

und dann auf den Funktionen mit myInterface->Init() zum Beispiel.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steve schrieb:

> In "C++" hätte ich in der Klasse Comm noch eine "void* myInterface"

Sobald du in C++ irgendwo einen void-Pointer hast, solltest du wenn du 
mit mir zusammenarbeitest, besser einen extrem guten Grund dafür haben 
oder aber ganz schnell laufen können :-)

Und dasselbe gilt auch für C#


Kannst du deine Klassen mal etwas konkreter zeigen?
Dein Comm-Klasse kommt wir ein wenig Spanisch vor. Ich denke momentan, 
die Ableitung eines Comm Objektes von I ist nicht das was du willst. Im 
Moment bin ich noch nicht mal davon überzeugt, dass es diese COMM Klasse 
überhaupt braucht.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, COM erbst auch von I und enthält zusätzlich zwei Instanzen? Wozu 
ist das gut?

Im prinzip kannst Du es genau wie in C++ machen, einfach eine Factory 
Methode die Object mit Interface I zurückgibt.


Gruß
Tom

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein guter Anhaltspunkt ist folgender

Du willst von einer Klasse A eine Klasse B ableiten, wenn logisch 
gesehen einer der beiden Sätze Sinn macht

    B  ist-ein  A

oder

    B  implementiert  A


Wenn dein logischer Zusammenhang aber lautet:

    b hat-ein A

dann ist Ableitung nicht das Mittel der Wahl, sondern das bedeutet im 
Regelfall, dass die Klasse B eine Instanz der Klasse A als Member hat.

Beispiele:
Es gibt KFZ (Kraftfahrzeuge), PKW, LKW. Weiters gibt es Motoren, Beziner 
und Diesel.

Ein PKW ist-ein KFZ. Die Klasse PKW wird daher von KFZ abgeleitet 
sein.
Aber: Ein KFZ hat-einen Motor. Die Klasse KFZ wird daher nicht von der 
Klasse MOTOR hergeleitet, sondern enthält eine Instanz davon als Member.

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups! stimmt, SUB und RS232 sind nicht von I geerbt.
public interface I
{
    int Init();
    void Close();
    int WriteData();
    int ReadData();
}

public class USB
{
    int Vid = 0;
    int Pid = 0;
    .
    .
    .
    public USB(int vid, int pid)
    {
       .
       .
    }
    .
    .
    .
}

public class RS232
{
    .
    .
    .
    .
}  
 public class COM : I 
 {
        USB myUSB;
        RS232 myRS232
        // etc...

      public int init()
      {
         .
         .
         .
       }
       .
       .
       .
 
} 


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steve schrieb:
> Ups! stimmt, SUB und RS232 sind nicht von I geerbt.

Sollten sie aber

I ist die abstrakte Beschreibung dessen, was ein Kommunikationsobjekt 
alles können muss, damit man darüber eine Kommunikation aufbauen kann.

USB ist eine konkrete Implementierung davon
RS232 ist eine konkrete Implementierung davon


Nur was der Zweck der COM Klasse sein soll, ist mir noch nicht ganz 
klar.

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Ziel ist das jedes Mal wenn der User den Interface wechselt alles 
neu initalisiere und die richtigen Funktionen aufrufe, ich muss 
irgendwie dynamisch zwischen die Interfaces wechsele ohne jedes Mal den 
Interface zu prüfe und ohne mit:
if(interface == USB)
        USB.Init();
else if(interface == RS232)
        RS232.Init();

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edit: Es könnte natürlich auch noch sein, dass dir die gemeinsame 
Basisklasse für USB und RS232 noch fehlt, bzw. das diese eben nicht I 
ist. Kommt ganz darauf an, auf welcher logischen Ebene das Interface I 
selbst angesiedelt ist. Und daher sind solche Namen wie I ziemlich 
schlechte Namen, weil sie nichts darüber verraten, was die Absicht des 
Programmierers war. Ist I eher auf der Seite der abstrakten 
Kommunikationsgeräte angesiedelt oder sollte man bei I eher in Richtung 
Device-Treiber denken?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steve schrieb:
> das Ziel ist das jedes Mal wenn der User den Interface wechselt alles
> neu initalisiere und die richtigen Funktionen aufrufe, ich muss
> irgendwie dynamisch zwischen die Interfaces wechsele ohne jedes Mal den
> Interface zu prüfe und ohne mit:
>
> if(interface == USB)
>         USB.Init();
> else if(interface == RS232)
>         RS232.Init();
> 



Ich denke dir fehlt ganz eindeutig die gemeinsame Basisklasse für USB 
und RS232.

Und nope. So wie du das hier gezeigt hast, macht man das nicht.
Immer wenn du in einer OOP Sprache dazu tendierst, anhand eines Typs 
eine von mehreren Funktionen auszuwählen, solltest du sofort 
'Inheritance' bzw in C++ 'virtuelle Funktion' denken, und den if gleich 
wieder weglöschen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
public interface DeviceInterface
{
  int Init();
  void Close();
  int WriteByte();
  int WriteString();
  int WriteData();

  ...
}

public class USB : DeviceInterface
{
 ...
}

public class RS232 : DeviceInterface
{
 ...
}

public interface I
{
    int Init();
    void Close();
    int WriteData();
    int ReadData();
}

public class COM : I 
{
  DeviceInterface currentDevice;

  public int init()
  {
    if( user_auswahl ist USB )
      currentDevice = new USB;
    else
      currentDevice = new RS232;

    currentDevice.Init();
  }

  public void Close()
  {
    currentDevice.Close();
  }

  ....
}

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok vielen Dank schon mal.

ist die Struktur unten die richtige Richtung:

                -->  USB Klasse
Basis Klasse -->
                -->   RS232 Klasse

Comm Klasse:
           USB  myUSB
           RS232 myRS232
           Basis myCom

und je nach Interface: myCom = myUSB oder myCom = myRS232?
.
.
.
myCom.Init();

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger
ich war langsammer

vielen Dank nochmal, jetzt ist deutlicher.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.