2013-08-14 5 views
1

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

Тогда у меня есть функция MustOverride SetupTimeProgram в этом базовом классе.

Как я прочитал из определения переопределений, я должен иметь «Подходящие подписи. Подпись этого объявления должна точно соответствовать сигнатуре свойства или процедуры, которые она переопределяет. Это означает, что списки параметров должны иметь одинаковое количество параметров в том же порядке с одинаковыми типами данных. "

Аргумент этой функции - это программа TimeProgram, которую я должен передать насосу, но каждый насос имеет другой способ установить свою собственную программу времени. По этой причине я не могу определить на высоком уровне тип аргумента.

Так что я в базовом классе:

Public MustOverride Function SetupTimeProgram(ByRef TimeProgram As Object) As Boolean 

где TimeProgram определяется как родовой объект.

Тогда в каждой отдельной реализации SetupTimeProgram я сделать что-то вроде этого:

Осуществление-A

Public Overrides Function SetupTimeProgram(ByRef Program As Object) As Boolean 
    Return DoSomething_A (Program.Time(), Program.Steps()) 
End Function 

Реализация-B

Public Overrides Function SetupTimeProgram(ByRef Program As Object) As Boolean 
    Return DoSomething_B (Program.Line(), Program.MaxPressure, Program.MinPressure) 
End Function 

В другом слове аргумент полностью отличается каждая реализация.

Моя цель - создать общий метод SetupTimeProgram, чтобы написать тот же код для всех насосов. Таким образом, кто использует класс, должен заботиться только о том, чтобы передать аргумент правильным образом и форматировать.

Мне интересно, если это правильный способ сделать это.

+0

Этот вопрос лучше подходит для сайта [CodeReview] (http://codereview.stackexchange.com). –

ответ

3

Вы можете использовать интерфейс для параметра, поместив функции DoSomething_A и DoSomething_B в конкретные реализации классов.

Interface ITimeProgram 
    Sub DoSomething() 
End Interface 

Class TimeProgramA : Implements ITimeProgram 
    Public Property Time As DateTime 
    Public Property Steps As Integer 

    Public Sub DoSomething() Implements ITimeProgram.DoSomething 
     ' do something with the Time and steps properties 
    End Sub 
End Class 

Class TimeProgramB : Implements ITimeProgram 
    Public Property Line As String 
    Public Property MaxPressure As Integer 
    Public Property MinPressure As Integer 

    Public Sub DoSomething() Implements ITimeProgram.DoSomething 
     ' do something with the Line and min/max pressure properties 
    End Sub 
End Class 

Затем, вместо того, аннотацию (MustOverride) метод, только реализовать его как

Public Function SetupTimeProgram(ByRef Program As ITimeProgram) As Boolean 
    Return Program.DoSomething() 
End Function 

таким образом:

  1. пользователь должен передать действительный ITimeProgram в метод
  2. ITimeProgram экземпляр должен знать, как DoSomething