在 Delphi 中,我们可以将接口的实现委托给另一个类,我想知道这在 C# 中是否可行?
例如,我有接口 IMyInterface,我说 TMyClass 实现了 IMyInterface。但实际上并没有。在内部,我可以使用 implements 关键字将接口实现委托给另一个类,而不必在 TMyClass 中声明每个方法。
有一个简单的答案:不,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...
WhereDoThis
和DoThat
are 方法ISomeInterface
必须由Blah
. 在 C# 中,您必须将这些方法中的每一个显式委托给包含的接口。implements
在Delphi 中,当您在aclass
或interface
类型的属性之后使用关键字时,这是自动完成的(即方法在幕后生成和调用,对用户不可见) 。
我假设一些回答者对术语implements
and 的使用感到困惑delegation
,它们在 C# 中具有不同的含义。
我认为没有任何实用的方法。您可以将实现类编写为抽象类,这反过来变得非常笨拙,因为您不能再实例化第一个类。唯一的办法是写一些丑陋的空虚方法,像这样:
public interface ISomething
{
void DoOne();
void DoTwo();
}
public class Something : ISomething
{
public virtual void DoOne() { }
public virtual void DoTwo() { }
}
但这是一个糟糕的类设计 IMO,因为您确实应该首先将实现类抽象化,因此人们无法实例化实现虚假接口的类的实例。
因此,正确的方法是在您的“抽象”类中部分实现接口,并通过将其他类标记为抽象来将它们委托给继承类(直到要实现的派生类)。
IE
public interface ISomething
{
void DoOne();
void DoTwo();
}
public abstract class Something : ISomething
{
public abstract void DoOne();
public abstract void DoTwo();
}
这样,没有人可以直接实例化你不稳定的“Something”类,但仍然需要派生类来实现尚未实现的接口的抽象方法。这更加健壮和安全。
请注意,如果您正在实现的是您的 OWN 接口,请将其废弃。将接口编写为一个抽象类,以开始并实现一些方法,这要容易得多。
您可以使用部分类,这将使您可以将实现放到不同的文件中,类的两个部分应该在同一个程序集中。
Class1.cs
public partial class Class1: IInterface {}
Class1Impl.cs
public partial class Class1 { /*implementation */ }
我无法想象另一种方式来做你想做的事。只需使用封装 =) 这不是您真正想要的,您必须编写一些存根代理方法。
在 C# 中,您不能委托类的接口实现,除非通过继承(请参阅Nikola Anusev的答案)。
但是,您可以使用部分类定义将接口实现与类的其余部分分开。
在一个(MyClass.Specific.cs)文件中,您有:
public partial class MyClass
{
void MySpecificMethod() {...}
}
在另一个文件(MyClass.IMyInterface.cs)中,您只有特定于类的方法:
public partial class MyClass : IMyInterface
{
void IMyInterface.MySpecificMethod() {...}
}
您仍然拥有 MyClass 中的所有方法,但在不同的文件中。
您可以使用部分类:
// SomeThing.cs
public partial class SomeThing
{
// your interface independant part
}
// SomeThing.ISomeThing.cs
public partial class SomeThing: ISomeThing
{
// ISomeThing implementation
}
这两个文件需要在同一个程序集中。它们被编译器组合成一个类。