类都扩展了抽象类并实现了接口

Ric*_*nop 5 .net c# oop abstract-class interface

如果我有一个扩展抽象类并实现接口的类,例如:

class Example : AbstractExample, ExampleInterface
{
    // class content here
}
Run Code Online (Sandbox Code Playgroud)

如何初始化这个类,以便我可以从接口和抽象类访问方法?

当我做:

AbstractExample example = new Example();
Run Code Online (Sandbox Code Playgroud)

我无法从界面访问方法.

Ste*_*ger 10

你需要

  • 在AbstractExample中实现接口
  • 或者获得对Example的引用

Example example = new Example();


Owe*_*wen 6

最后一个例子将你绑定到一个接口或抽象类的实体实例,我认为这不是你的目标.坏消息是你不是在这里使用动态类型的语言,所以你坚持要么引用一个固定的"示例"对象,如先前的sprcified或cast/uncasting,即:

AbstractExample example = new Example();
((IExampleInterface)example).DoSomeMethodDefinedInInterface();
Run Code Online (Sandbox Code Playgroud)

你的其他替代方法是让AbstractExample和I​​ExampleInterface都实现一个通用接口,这样你就可以了

abstract class AbstractExample : ICommonInterface
interface IExampleInterface : ICommonInterface
class Example : AbstractExample, IExampleInterface
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用ICommonInterface,并具有抽象类和IExample接口实现的功能.

如果这些答案都不可接受,您可能需要查看一些在.NET框架下运行的DLR语言,即IronPython.

  • Downvoted.C#不是动态类型语言.你也没有提供最简单的答案,例如example = new Example(); (2认同)
  • @Paul Batum和@Noldorin:纯粹的错字,不值得一个downvote,只是错过了"NOT"关闭.@Paul Batum - 你遗漏了这一点,帖子显然不希望与Example类有很强的依赖关系,因此他为什么要接口并将其抽象出来. (2认同)

Ken*_*art 5

如果您只知道抽象类,则表明您通过实例知道实际类型Type.因此,您可以使用泛型:

private T SomeMethod<T>()
    where T : new(), AbstractExample, ExampleInterface
{
    T instance = new T();
    instance.SomeMethodOnAbstractClass();
    instance.SomeMethodOnInterface();
    return instance;
}
Run Code Online (Sandbox Code Playgroud)