C#中的接口委派

时间:2012-07-05 10:56:25

标签: c# delphi interface

在Delphi中,我们可以将接口的实现委托给另一个类,我想知道这是否可以在C#中使用?

例如,我有接口IMyInterface,我说TMyClass实现了IMyInterface。但事实上并非如此。在内部,我可以使用implements关键字将接口实现委托给另一个类,而不必在TMyClass中声明每个方法。

5 个答案:

答案 0 :(得分:5)

有一个简单的答案:不,C#不允许它像Delphi一样。

对于那些了解C#但不知道Delphi的人来说,这就是:http://docwiki.embarcadero.com/RADStudio/en/Implementing_Interfaces,请参阅“按委派实现接口(仅限Win32)”部分。

我猜你必须手动将方法调用传递给接口。我的C#有点生锈(我仍然可以很好地阅读它):

public class Blah : ISomeInterface
{
    public ISomeInterface implementer { getter and setter here }

    public int ISomeInterface.DoThis() 
    { 
        if (implementer) return implementer.DoThis(); 
    }
    public void ISomeInterface.DoThat(int param) 
    { 
        if (implementer) implementer.DoThat(param); 
    }

etc...

其中DoThisDoThat是必须由ISomeInterface实施的Blah方法。在C#中,您必须将每个方法显式委托给包含的接口。在Delphi中,当您在implements或{{1}的属性之后使用class关键字时,会自动完成此操作(即,在幕后生成并调用方法,对用户不可见) } type。

我认为有些回答者会因使用{C}中具有不同含义的interfaceimplements这两个词而感到困惑。

答案 1 :(得分:0)

我认为没有任何实际的方法。你可以将实现类编写为抽象类,这反过来变得非常笨拙,因为你不能再实例化第一个类。唯一的方法是编写一些丑陋的空虚拟方法,如下所示:

public interface ISomething
{
    void DoOne();
    void DoTwo();
}

public class Something : ISomething
{
    public virtual void DoOne() { }
    public virtual void DoTwo() { }
}

但是这是一个糟糕的类设计IMO,因为你应该首先将实现类 abstract 放在首位,这样人们就无法实例化实现伪造接口的类的实例。

因此,正确的方法是在“抽象”类中部分实现接口,并通过将其标记为抽象类来将其他类委托给继承类(直到要实现的派生类)。

public interface ISomething
{
    void DoOne();
    void DoTwo();
}

public abstract class Something : ISomething
{
    public abstract void DoOne();
    public abstract void DoTwo();
}

这样,没有人可以直接实例化你不稳定的“Something”类,但派生类仍然是 required 来实现尚未实现的接口的抽象方法。这更加强大和安全。

请注意,如果您正在实施自己的OWN界面,请将其废弃。将接口编写为一个抽象类,开始并实现一些方法,这更容易。

答案 2 :(得分:0)

您可以使用partial classes

// SomeThing.cs
public partial class SomeThing
{
   // your interface independant part
}

// SomeThing.ISomeThing.cs
public partial class SomeThing: ISomeThing
{
   // ISomeThing implementation
}

这两个文件需要在同一个程序集中。它们由编译器组合成一个类。

答案 3 :(得分:0)

你可以使用一个局部类,这样你就可以将实现放到不同的文件中,类的两个部分应该在同一个程序集中。

的Class1.cs

public partial class Class1: IInterface {}

Class1Impl.cs

public partial class Class1 { /*implementation */ }

我无法想象在另一种方式做你想做的事。 只是使用encapsulation =)它不是你真正想要的,你必须编写一些存根代理方法。

答案 4 :(得分:0)

在C#中,除了通过继承之外,你不能委托类的接口实现(参见 Nikola Anusev 的答案)。

但是,您可以使用部分类定义将接口实现与类的其余部分分开。

在一个( MyClass.Specific.cs )文件中,您有:

public partial class MyClass
{
    void MySpecificMethod() {...}
}

在另一个文件( MyClass.IMyInterface.cs )中,您只有类特定的方法:

public partial class MyClass : IMyInterface
{
    void IMyInterface.MySpecificMethod() {...}
}

你仍然拥有MyClass中的所有方法,但是在不同的文件中。