2016-05-12 8 views
1

Я не уверен, что это возможно, как я пытался это сделать. Возможно, я ошибаюсь, поэтому я попытаюсь немного объяснить большую картину. Я довольно новичок в такого рода программировании.Типы вложений и поля доступа

Я использую библиотеку NationalInstruments.VISA для доступа к устройствам. Когда вы открываете соединение, библиотека определяет, к какому типу подключений он подключен, и загружает интерфейс для соответствия, что дает вам доступ ко всем полям конфигурации для этого соединения. Программа извлекает файл XML для восстановления сохраненных соединений и их конфигураций.

В моей программе я хочу иметь массив объектов, которые определяют все отобранные параметры соединения, чтобы они могли ссылаться при необходимости. У меня возникли проблемы с определением того, как определить этот набор объектов.

Это общий пример того, как я хотел бы использовать объекты после их определения.

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 
    } 
} 

метода, которые я пробовал, кажется, поймите меня близко, но я не могу получить доступ к полям подклассов без непосредственного объявить массив как этот подкласс. Вероятно, я просто подошел к этому неправильно, но я не понял альтернативного пути.

+0

[Внутренние классы Java в C#] (http://stackoverflow.com/questions/2367015/java-inner-classes-in-c-sharp) может объяснить вашу проблему (я не совсем уверен, что вы проблема с кодом, который вы показали, кажется разумным) –

ответ

1

У вас не хватает какой-то наследство, для вашего кода для работы

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; 
} 

и приведения типа к соответствующему параллельного типа

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

Ah! Это то, что мне нужно. У меня был материал для наследования в моем коде, но мне не хватало приведения типов. Как только я вложил это, я смогу добраться до всех полей. Благодаря! – nosjojo

0

Device[] devlist = new Device[2];

Эта линия говорит вам, что variabledevlist является array от typeDevice. Смысл, он может принимать только objects, в котором находится либо прямой implementation, либо inherits от Device.

Таким образом, если вы считаете Serial и GPIB как более конкретный implementation типа Device вы можете использовать inheritance как этот

class Serial : Device

class GPIB : Device

или гораздо лучше, сделать Deviceinterface, как это

interface IDevice