类内的C#调用接口方法
不要将类内的C#调用接口方法,c#,class,interface,call,C#,Class,Interface,Call,不要将用作,只需强制转换: interface ILol { void LOL(); } class Rofl : ILol { void ILol.LOL() { GlobalLOLHandler.RaiseROFLCOPTER(this); } public Rofl() { //Is there shorter way of writing this or i is there "other" problem with impl
用作
,只需强制转换:
interface ILol
{
void LOL();
}
class Rofl : ILol
{
void ILol.LOL()
{
GlobalLOLHandler.RaiseROFLCOPTER(this);
}
public Rofl()
{
//Is there shorter way of writing this or i is there "other" problem with implementation??
(this as ILol).LOL();
}
}
您可能需要将强制转换从
(此为ILol)
更改为((ILol)此)
。as cast允许返回null,这可能会在以后导致混淆错误,编译器必须对其进行测试。如果您显式实现接口,则不允许返回null。如果通过从实现的方法中删除接口名使其隐式化,它将按您的需要工作
((ILol)this).LOL();
您已经实现了通常不需要执行的接口。相反,只需隐式实现它,并像调用任何其他方法一样调用它:
void LOL()
{
GlobalLOLHandler.RaiseROFLCOPTER(this);
}
public Rofl()
{
LOL();
}
(注意,您的实现也需要公开。)您根本不需要强制转换。由于
ROFL
实现了ILOL
,因此您可以简单地调用this.LOL()
甚至只调用LOL()代码>您意识到您的代码示例仍然显式地实现了它,对吗?:)隐式和显式实现之间的区别是什么?如果我不加我的名字。在LOL之前,编译器会抱怨没有实现ILol.LOL。只有当对象转换为接口类型时,才能调用显式接口。这有各种模糊的优点,但否则你应该避免它。至于为什么你的代码不起作用,我只能猜测:实现你的接口的方法是否可以公开访问?澄清一下:ladenedge在上面的评论中说的是,OP需要在他的声明前面添加public
,当他拿走ILol.
-1时,他错了。ROFL显式实现ILOL
,并且在没有访问ILOL
实例(this
casted)的情况下无法访问ILOL
成员。是否再次?as
强制转换与非as
强制转换有什么问题?在检查null之前使用从as
返回的对象是一种不好的做法。上面的代码在编写时不会出现任何问题,但在重构过程中不会有太大的恢复力。as cast可能返回null,因此编译器需要在调用该方法之前测试null,以便生成null引用异常。常规强制转换永远不能返回null,因此编译器可以省略null测试。上面的讨论可能会让最近学会将用作
的人感到困惑,因此他们可以处理无法将对象强制转换为目标类型的情况。规则是:如果您不能100%确定强制转换始终有效,请使用作为
,然后测试结果是否为null
。如果它不可能失败[在这里,我们知道这是一个ILol
,因为它被定义为],那么就直接执行强制转换,(ILol)
。尽量避免从构造函数调用“虚”函数!您可能会调用访问未完全构造的对象的实现。
class Rofl : ILol
{
public void LOL() { ... }
public Rofl()
{
LOL();
}
}