我申报会员时可以指定接口吗?

时间:2008-11-13 09:07:24

标签: c# interface

我需要我的班级成员作为控制,并且要实现我们定义的接口。

如果我这样声明......

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;
}

......除了这些都不起作用。我可以在声明成员时指定接口,如果是,那么如何?

6 个答案:

答案 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#是静态类型的 - 而不是“鸭子类型”语言,所以它无法自动控制你想要的任何接口。