我需要我的班级成员作为控制,并且要实现我们定义的接口。
如果我这样声明......
public class MyClass
{
public Control MyMember;
}
...然后我没有得到接口方法,但如果我这样声明它......
public class MyClass
{
public IMyInterface MyMember;
}
...然后我没有得到Control方法。有没有办法指定MyMember必须初始化为从两者继承的类型?我在MSDN上找不到一个。有点像...
public class MyClass
{
public Control : IMyInterface MyMember;
}
......或......
public class MyClass
{
public Control MyMember : IMyInterface;
}
......除了这些都不起作用。我可以在声明成员时指定接口,如果是,那么如何?
答案 0 :(得分:2)
您可以使用具有约束的泛型:
public interface MyClass {
public T GetMyControl() where T : Control, IMyInterface { /* ........ */ }
}
答案 1 :(得分:1)
因为围绕Control和一个简单的泛型类编写包装类非常麻烦:
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();
}
}
}
}
答案 2 :(得分:0)
您可以从控件派生自己的类,界面定义如下:
class MyControl : Control, IMyInterface
{
}
然后使用此类作为成员:
public class MyClass
{
public MyControl MyMember;
}
答案 3 :(得分:0)
答案 4 :(得分:-1)
在界面上使用继承的力量
public interface IMyInterface : Control
{
..
}
现在你说你想要一个特殊方法的控件。
编辑: 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..]
}
答案 5 :(得分:-1)
这听起来根本就错了。
IMyInterface是否只声明与Control类中相同的方法/属性? 如果没有,你希望完成什么?您无法实现接口并忽略其中声明的方法 - 您必须明确写出实现。
如果IMyInterface实际上只声明与Control类中相同的方法/属性,则必须创建自己的MyControl类,该类继承自Control并实现IMyInterface。这不是语言的一些愚蠢的怪癖。 Control类没有被定义为IMyInterface而C#是静态类型的 - 而不是“鸭子类型”语言,所以它无法自动控制你想要的任何接口。