2014-11-08 4 views
1

Мне нужно все мое TableAdapters для реализации пользовательского интерфейса. Проблема в том, что некоторые члены, определенные интерфейсом, находятся в файле конструктора DataSet, который я не хочу (и не должен) изменять, так как этот код будет автоматически регенерироваться. Я не могу переместить этих членов в свой файл кода по той же причине. Какой у меня выход?Внедрить интерфейс в частичном классе

+0

Это строго типизированный DataSet. Каждый DataTable имеет свой собственный TableAdapter, который, к сожалению, наследуется от «Компонента» вместо «DbTableAdapter» или чего-то более конкретного, поэтому я пытаюсь заполнить пробел, реализуя свой собственный интерфейс во всех этих адаптерах. – dotNET

+0

Вы можете создать пользовательский класс, реализующий интерфейс, и расширить DataSet или компонент или что-то еще, а затем использовать его вместо предопределенных компонентов пользовательского интерфейса. Таким образом, вы будете иметь свое обычное поведение и TableAdapter сразу. – pasty

+0

@pasty: Вы работали с сильно типизированными DataSets? Это поможет понять, о чем я говорю. У меня есть несколько DataTables, и каждый из них имеет свой собственный TableAdapter. Все они уже имеют общие свойства и методы (с точно такими же сигнатурами). Просто эти классы TableAdapter не наследуются от хорошего базового класса, и они не реализуют общий интерфейс, поэтому я должен писать один и тот же код для каждого TableAdapter отдельно. Благодаря специальному интерфейсу, реализованному всеми из них, я мог бы использовать полиморфизм для обработки всех этих адаптеров за один раз. – dotNET

ответ

2

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

Partial Public Class SomeClass 

    Public Sub FirstMethod() 
     Console.WriteLine("FirstMethod") 
    End Sub 

    Public Sub SecondMethod() 
     Console.WriteLine("SecondMethod") 
    End Sub 

End Class 

и вы хотите, чтобы реализовать этот интерфейс:

Public Interface ISomeInterface 

    Sub FirstMethod() 

    Sub ThirdMethod() 

End Interface 

Обратите внимание, что интерфейс имеет метод с именем FirstMethod но SomeClass уже есть метод FirstMethod. Вы можете добавить свой собственный частичный класс для реализации интерфейса, как это:

Partial Public Class SomeClass 
    Implements ISomeInterface 

    Private Sub FirstMethodInternal() Implements ISomeInterface.FirstMethod 
     Me.FirstMethod() 
    End Sub 

    Public Sub ThirdMethod() Implements ISomeInterface.ThirdMethod 
     Console.WriteLine("ThirdMethod") 
    End Sub 

End Class 

Метод, который реализует ISomeInterface.FirstMethod не назван FirstMethod поэтому он не вступает в противоречие с существующим методом с этим именем, и это также Private так это не могут быть доступны извне, используя ссылку типа SomeClass. Однако использование ссылки типа ISomeInterface - другое дело. Если вы используете такой код:

Dim sc As ISomeInterface = New SomeClass 

sc.FirstMethod() 
sc.ThirdMethod() 

вы увидите, что FirstMethodInternal метод вашего SomeClass объекта вызывается, и, в свою очередь, вызывает FirstMethod метод того же объекта. Попробуйте запустить этот код и поместите контрольные точки в методах FirstMethod и FirstMethodCore, чтобы доказать это самому себе.

+0

Это великолепно. Никогда не осознавали, что это могут быть частные. Огромное спасибо. – dotNET

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