2008-11-13 53 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 
{ 
    .. 
} 

上现在你说你想用一些特殊的方法控制。


编辑:第三文化孩子当然是正确的..你不能继承一个具体类的接口。

解决此问题的一种方法可能是使用返回控件的属性或方法来扩展接口。

样品:

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(本身)。然后,您可以从两个ISelf(管制)和ISelf(的IMyInterface的)一个类继承并宣布你的领域MyMember为类型ISelf(IMyInterface的的(控制))。 MyMember可以作为iMyInterface使用,MyMember.Self作为控件使用。任何数量的接口都可以用这种方式进行组合。

[*]用于避免将尖括号作为HTML标记进行处理的泛型的VB语法。

相关问题