2014-10-28 2 views
-2

Я пытаюсь перестроить некоторые старые QBASIC (да, вы читаете эти права) программы для использования на более современных системах (потому что почему-то дети в эти дни не любят DOS).Интерфейсы/Классы/Объекты и наследование

Я понимаю основные принципы классов и объектов (я думаю), но я, очевидно, что-то пропустил.

У меня есть ряд инструментов, которые управляются с использованием GPIB, используя библиотеки VISA COM. Я могу заставить его работать, но код очень некрасиво :(

Для того, чтобы использовать инструмент, я следующий в моем классе Public Main:

Public ioMgr As Ivi.Visa.Interop.ResourceManager 
Dim myInstrument As New Ivi.Visa.Interop.FormattedIO488 
Dim myInstOpen As Boolean 

Потом, когда я пришел к запуску, инструмент (в «» ИНИЦИАЛИЗИРУЙТЕ кнопку мыши суб), я использую:

Try 
    myInstrument.IO = ioMgr.Open("GPIB0::17") 
Catch exOpen As System.Runtime.InteropServices.COMException 
    myInstOpen = False 
End Try 

Довольно простой вещи, если прибор не может быть открыт по адресу 17 на GPIB0, он бросает исключение, которое попадается и наборы флаг 'myInstOpen' равен false.

Тогда, я могу общаться с инструментом с помощью команд из интерфейса Ivi.Visa.Interop.FormattedIO488, такие как:

myInstrument.IO.ReadSTB() 
result = myInstrument.ReadString() 
myInstrument.WriteString("GPIB Command Here") 

И все это работает.

Что я хочу сделать, создайте общий класс «Инструмент», который позволяет мне получить доступ ко всем функциям интерфейса Ivi.Visa.Interop.FormattedIO488 и от интерфейса Ivi.Visa.Interop.ResourceManager, но также позволяет мне создавать собственный класс.

Например:

Public Class GPIBInst 
Implements Ivi.Visa.Interop.FormattedIO488 
    Public Address As Integer 
    Public Sub setAddress(ByVal Addr As Integer) 
     Address = Addr 
    End Sub 
    Public Function getAddress() As Integer 
     Return Address 
    End Function 
    Public Function readIO() As String 
     Dim Data As String = me.ReadString() 
     Dim Result As String = mid(Data,2,7) 
     Return Result 
    End Function 
End Class 

Это позволит мне использовать функции из интерфейса, но и настраивать инструменты для других полезных вещей внутри программы. Например, GPIBInst.Address нужно использовать в других местах, а GPIBInst.readIO() можно использовать вместо простого ReadString(), так что я могу немного настроить вывод.

НО когда я пытаюсь сделать это, я не могу наследовать от интерфейса (потому что это интерфейс), и я не могу реализовать интерфейс, потому что он говорит, что мой класс должен реализовать каждый функции, которые предоставляет интерфейс. Мне не нужны все эти функции, а также я не могу разобраться, как все это записывать в мой класс (у них есть куча случайных вещей, в которых я не понимаю LOL).

Если кто-то может увидеть, куда я происхожу из и может предложить несколько советов, я бы очень признателен =)

+0

Когда вы говорите, что вы «не можете реализовать интерфейс», какой интерфейс вы имеете в виду? Есть ли другая реализация этого интерфейса, к которой вы хотите добавить функциональность, или вы сами реализуете интерфейс самостоятельно? –

+0

Привет, Дэвид, я имею в виду интерфейс Ivi.Visa.Interop.FormattedIO488. я могу реализовать интерфейс таким способом: Dim myInstrument Как Новый Ivi.Visa.Interop.FormattedIO488 Но тогда я не могу добавить дополнительные свойства к нему, такие как адрес –

+0

И когда я использую Открытый класс GPIBInst Реализует Ivi.Visa.Interop.FormattedIO488 Он просит меня реализовать каждую функцию из интерфейса = ( –

ответ

0

Интерфейс должен представлять собой последовательный набор функциональных возможностей; реализуя ее часть, но не все это нарушает цель концепции. При этом очень часто для API-интерфейсов в объектно-ориентированных языках, которые обертывают системы, отличные от OO, просто определяют один массивный интерфейс, а не разбивают функциональность на логические подгруппы и определяют интерфейс для каждой группы.Если это ваше обстоятельство и вы хотите реализовать интерфейс, у вас нет выбора, кроме как реализовать каждый метод из интерфейса (хотя вы можете бросить исключение NotImplementException для любого метода, который вы не хотите полностью реализовать, если только это не будет препятствовать правильному функционированию вашего класса).

+0

"обернуть системы без OO, чтобы просто определить один массивный интерфейс, а не разбить функциональность на логические подгруппы" Это, кажется, точно, что они сделали здесь с библиотекой, которую они предоставили. Есть ли простой способ частично реализовать Какие методы/функции мне не нужны? Например: Класс «Инструмент» должен реализовать «Sub WriteList» (данные ByRef As Object, [type As IEEEASCIIType = IEEEASCIIType.ASCIIType_Any], [listSeperator As String = ","], [flushAndEND As Boolean = True]) 'для интерфейс «Ivi.Visa.Interop.IFormattedIO488». –

+0

Должен ли я написать целое: Sub WriteList (данные ByRef As Object, [type As IEEEASCIIType = IEEEASCIIType.ASCIIType_Any], [listSeperator As String = ","], [flushAndEND As Boolean = True]) Реализует Ivi. Visa.Interop.FormattedIO488.WriteList А потом каким-то образом объявите его так, чтобы его вообще нельзя было получить в классе (в случае, если кто-то использует функцию в интерфейсе, который я не полностью реализовал)? –

Смежные вопросы