C#:可选方法

bur*_*1ce 3 c# oop

我有一个实现接口的对象.如果它被实现,我想调用对象的方法.这样做的最佳方法是什么?

更新 你们中的一些人提到我的问题很模糊.对于那个很抱歉.当我说"如果它被实现"我的意思是"如果它是可调用的".谢谢你的回答和努力的家伙(或女孩!).我很惊讶这个网站上有多少开发者支持.

Jim*_*ake 14

如果这真的是你需要它的工作方式,那么接口是错误的选择.相反,您可以拥有一个抽象类,您的类可以使用虚拟方法从中派生.Virtual允许覆盖它,但不需要它.由于虚方法具有实现,因此它不能是接口的一部分.

  • 子类仍将具有虚拟方法实现.它将是基类实现. (2认同)

Jas*_*yon 12

不太确定你的意思是"如果实施的话".如果方法在接口中并且您的对象实现了接口,则它必须实现该方法.


woj*_*ojo 10

如果要测试对象是否实现了接口以便可以调用该方法,则可以这样做:

interface IFoo { void Bar(); }

object o = GetObjectThatMayImplementIFoo();
IFoo foo = o as IFoo;

if (foo != null) {
  foo.Bar();
}
Run Code Online (Sandbox Code Playgroud)

我想那就是你问的问题?

  • 请注意,不鼓励使用模式`is`后跟强制转换,您应该使用`as`并检查`null`(由于运行时不执行两次类型转换,因此性能更好). (3认同)

Ami*_*shk 7

创建两个接口,并继承需要所有方法的两个接口.仅继承其中一个不需要可选方法的接口.您还可以创建一个基本接口,所有接口都将从该接口继承,以供OOP使用.


Cyl*_*Cat 5

我认为您真正要寻找的是部分方法。这些是 .NET 3.5 中的新功能。您只需将该方法声明为“部分”:

partial void OnLoaded();
Run Code Online (Sandbox Code Playgroud)

该方法可以正常调用:

OnLoaded();
Run Code Online (Sandbox Code Playgroud)

巧妙的是,如果该方法没有在任何地方实现,编译器足够聪明,不会生成调用。

这主要是为 LINQ to SQL 和实体框架实现的;这允许生成的代码(使用部分类)在不知道它们是否被实现的情况下定义和调用方法。

将部分方法与接口混合会很有趣(我还没有尝试过),但我的第一次尝试是在接口中声明一个部分方法。

  • 我怀疑这就是他所需要的。部分方法应该用于在同一类的两个部分之间设置可选的“回调”(其中一个通常是生成的,另一个是手动编码的)。它们有很多限制——仅限私有、`void` 返回等。它们绝对与接口无关。 (3认同)