2013-09-12 2 views
2

Можно ли расширять разные классы тем же общим классом? я пытался что-то вроде этого:vb.net, расширяющий класс с generics

Public Class A 
    Public Sub TestA() 
    Debug.Print("Test A") 
    End Sub 
End Class 

Public Class B(Of T) 
    Public Sub TestB() 
    Debug.Print("Test B") 
    End Sub 
End Class 

Public Class C 
    Inherits B(Of A) 

    Public Sub TestC() 
    TestA() '**<-- Thows error 'is not declared'** 
    TestB() 
    Debug.Print("Test C") 
    End Sub 
End Class 

Я поясню есть некоторые UserControls, которые вытекают из Combobox или Textbox и я хотел бы, как реализовать некоторые функции (и интерфейсы), которые определены в базовом классе. В C++ я бы сделал это с множественным наследованием.

+1

Вы можете посмотреть в "Mixins" http://stackoverflow.com/questions/6644668/mixins-with-c-sharp-4-0 – Derek

ответ

4

Возможно ли расширить различные классы с тем же общим классом?

Дженерики не являются чем-то вроде «обходного пути» из-за отсутствия множественного наследования, нет. Ваш класс C не получен из A - это просто означает, что T в B(Of T) будет A в контексте C.

Какой экземпляр A вы ожидаете, что TestA() будет называться? Создание экземпляра C конечно, не создает экземпляр A ...

Тот факт, что B(Of T) не использованиеT в любом месте должен быть предупреждающий сигнал - типы, которые являются родовыми, но никогда не использовать их общие параметры типа как правило, проблематичны.

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

Возможно, extension methods поможет?

+1

Да, вы правы ... Не знаю, могу ли я определять методы расширения на интерфейсах ... я попробую это –

2

Вы можете сделать так, чтобы оба класса Combobox и ваши классы Textbox реализовали один и тот же интерфейс.

Затем вы можете определить методы расширения для этого класса интерфейса.

0

Благодаря вашей подсказке я получил эту работу с расширениями

Public Class Form1 

    Public Interface IA 
     Property val As String 
    End Interface 

    Public Class A 
     Public Sub test() 
      Debug.Print("test") 
     End Sub 
    End Class 

    Public Class C 
     Inherits A 
     Implements IA 

     Public Property val As String Implements IA.val 

     Public Sub TestC() 
      val = "testxxx" 
      TestA()   
      test() 
     End Sub 
    End Class 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Dim ct As New C 
     ct.TestC() 
    End Sub 
End Class 

Module TestModule 
    <Extension()> 
    Public Sub TestA(ByVal pvIA As IA) 
     Debug.Print(pvIA.val) 
    End Sub 
End Module 

Таким образом, каждый класс может реализовать свой собственный «родитель» (например, здесь), и я не нужен реализовать функцию Тест для каждого класс.

спасибо

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