2008-11-13 2 views
2

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

Если я объявляю это так ...

public class MyClass 
{ 
    public Control MyMember; 
} 

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

public class MyClass 
{ 
    public IMyInterface MyMember; 
} 

... тогда я не получаю методы управления. Есть ли способ указать, что MyMember должен быть инициализирован типом, который наследуется от обоих? Я не могу найти его на MSDN. Что-то вроде ...

public class MyClass 
{ 
    public Control : IMyInterface MyMember; 
} 

... или ...

public class MyClass 
{ 
    public Control MyMember : IMyInterface; 
} 

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

ответ

-1

Используйте силу наследования по интерфейсу

public interface IMyInterface : Control 
{ 
    .. 
} 

Теперь вы говорите, что вы хотите контролировать с некоторыми специальными методами.


EDIT: TcKs, конечно, правильно .. вы не можете наследовать интерфейс от конкретного класса.

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

Пример:

public interface IMyInterface 
{ 
    Control Control { get; } 

    [..rest of the definition..] 
} 

и реализовать его так:

class MyControl : Control, IMyInterface 
{ 
    public Control Control { get { return this; } } 

    [..rest of the implementation..] 
} 
+0

Интерфейс не может наследоваться от класса. – TcKs 2008-11-13 09:12:15

+0

Конечно, вы правы. О чем я думал. – VVS 2008-11-13 09:18:52

+0

После редактирования у меня нет других замечаний :). – TcKs 2008-11-13 10:40:53

2

Вы можете использовать дженерики с ограничениями:

public interface MyClass { 
    public T GetMyControl() where T : Control, IMyInterface { /* ........ */ } 
} 
0

Вы можете иметь свой собственный класс, производный от контроля с интерфейс, определенный как:

class MyControl : Control, IMyInterface 
{ 
} 

, а затем использовать этот класс в качестве члена:

public class MyClass 
{ 
    public MyControl MyMember; 
} 
1

Поскольку это очень громоздки, чтобы написать класс-оболочку вокруг управления и простой универсальный класс:

public class MyGenericClass<T> where T : Control, IMyInterface 
{ 
    public T t; 
} 

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

public class MyClass 
{ 
    private IMyInterface m_field; 
    public Control FieldAsControl 
    { 
     get { return m_field as Control; } 
    } 
    public IMyInterface Field 
    { 
     get { return m_field; } 
     set 
     { 
      if (m_field is Control) 
      { 
       m_field = value; 
      } 
      else 
      { 
       throw new ArgumentException(); 
      } 
     } 
    } 
} 
-1

Это звучит в корне неправильно.

IMyInterface объявляет только те же методы/свойства, что и в классе Control? Если нет, что вы надеетесь достичь?Вы не можете реализовать интерфейс и игнорировать объявленные в нем методы - вы должны явно выписывать реализации.

Если IMyInterface фактически объявляет те же методы/свойства, что и в классе Control, вам необходимо создать собственный класс MyControl, который наследует Control и реализует IMyInterface. Это не какая-то глупая причуда языка. Класс Control не был определен как IMyInterface, а C# - это статически типизированный, а не «утиный» язык, поэтому он не может автоматически выдавать Контроль за любым интерфейсом, который вы желаете.

0

Объявите интерфейс ISelf (из T) [*], который включает в себя функцию «Я», которая возвращает T. Поддерживает ли ваш интерфейс универсальную и универсальную версию, где общая версия наследует и не общую версию и сам (сам по себе). Затем вы можете наследовать класс как от ISelf (Control), так и от ISelf (от IMyInterface) и объявить свое поле MyMember типом ISelf (IMyInterface (of Control)). Затем MyMember может использоваться как iMyInterface и MyMember.Self как элемент управления. Любое количество интерфейсов может быть объединено таким образом.

[*] Синтаксис VB для дженериков, используемых во избежание использования угловых скобок в качестве HTML-тегов.