2016-05-12 36 views
1

Ich bin mir nicht sicher, ob dies möglich ist, so wie ich es versucht habe. Ich könnte es falsch angehen, also werde ich versuchen, das größere Bild ein wenig zu erklären. Ich bin ziemlich neu in dieser Art von Programmierung.Verschachtelungstypen und zugängliche Felder

Ich verwende die NationalInstruments.VISA-Bibliothek, um auf Geräte zuzugreifen. Wenn Sie eine Verbindung öffnen, bestimmt die Bibliothek, welcher Verbindungstyp sie ist, und lädt eine entsprechende Schnittstelle, über die Sie auf alle Konfigurationsfelder für diese Verbindung zugreifen können. Das Programm ruft eine XML-Datei ab, um gespeicherte Verbindungen und ihre Konfigurationen aufzurufen.

In meinem Programm möchte ich ein Array von Objekten haben, die alle abgerufenen Verbindungseinstellungen definieren, so dass sie bei Bedarf referenziert werden können. Ich habe Probleme herauszufinden, wie man diesen Satz von Objekten zu definieren.

Dies ist ein generisches Beispiel dafür, wie ich die Objekte verwenden möchte, sobald sie definiert sind.

public class Device 
{ 
    public string type; 
} 
public class Serial 
{ 
    public int baudrate; 
    public string serialstuff; 
} 
public class GPIB 
{ 
    public int addr; 
    public string gpibstuff; 
    public string more stuff; 
} 

public example() 
{ 
    Device[] devlist = new Device[2]; 
    devlist[0]=new Serial(); 
    devlist[1]=new GPIB(); 

    foreach (Device dev in _devlist) 
    { 
     if (dev.type == serial) //send serial settings 
     if (dev.type == gpib) //send gpib settings 
    } 
} 

Die Methoden, die ich versucht habe, scheinen mir nahe zu kommen, aber ich kann nicht ohne direkt erklärt das Array als dieser Unterklasse die Felder der Unterklassen Zugriff scheinen. Ich komme wahrscheinlich nur falsch an, aber ich habe keinen alternativen Weg gefunden.

+0

[Java innere Klassen in C#] (http://stackoverflow.com/questions/2367015/java-inner-classes-in-c-sharp) kann erklären, Problem, das Sie haben (ich bin nicht genau sicher, was Sie habe ein Problem mit Code, den du gezeigt hast, scheint vernünftig zu sein) –

Antwort

1

Du etwas Erbe fehlt, für Ihren Code

public abstract class Device 
{ 
    public string type; 
} 
public class Serial : Device 
{ 
    public int baudrate; 
    public string serialstuff; 
} 
public class GPIB : Device 
{ 
    public int addr; 
    public string gpibstuff; 
    public string more stuff; 
} 

und Typumwandlung auf den entsprechenden gleichzeitigen Typen

if (dev.type == serial) 
{ 
    (dev as Serial).baudrate 
} 
+0

Ah! Das habe ich gebraucht. Ich hatte die Erbschaft in meinem Code, aber ich vermisste die Typumwandlung. Sobald ich das eingegeben habe, kann ich alle Felder erreichen. Vielen Dank! – nosjojo

0
zu arbeiten

Device[] devlist = new Device[2];

Diese Zeile sagt Ihnen, dass die variabledevlist ist ein von typeDevice. Das heißt, es kann nur objects akzeptiert werden, bei denen es sich entweder um eine direkte implementation oder inherits von Device handelt.

also, wenn Sie Serial und GPIB als speziellere implementation vom Typ betrachten Device Sie inheritance wie diese

class Serial : Device

class GPIB : Device

oder viel besser, machen den Device ein interface wie diese verwenden können

interface IDevice