在Delphi中,我们可以将接口的实现委托给另一个类,我想知道这是否可以在C#中使用?
例如,我有接口IMyInterface,我说TMyClass实现了IMyInterface。但事实上并非如此。在内部,我可以使用implements关键字将接口实现委托给另一个类,而不必在TMyClass中声明每个方法。
答案 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...
其中DoThis
和DoThat
是必须由ISomeInterface
实施的Blah
方法。在C#中,您必须将每个方法显式委托给包含的接口。在Delphi中,当您在implements
或{{1}的属性之后使用class
关键字时,会自动完成此操作(即,在幕后生成并调用方法,对用户不可见) } type。
我认为有些回答者会因使用{C}中具有不同含义的interface
和implements
这两个词而感到困惑。
答案 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中的所有方法,但是在不同的文件中。