5

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

class Example : AbstractExample, ExampleInterface
{
    // class content here
}

我怎样才能初始化这个类,以便我可以从接口和抽象类访问方法?

当我做:

AbstractExample example = new Example();

我无法从界面访问方法。

4

5 回答 5

10

你需要

  • 在 AbstractExample 中实现接口
  • 或获取对示例的参考

Example example = new Example();

于 2009-04-25T18:51:33.627 回答
6

最后一个示例会将您绑定到接口或抽象类的可靠实例,我认为这不是您的目标。坏消息是您在这里不是使用动态类型的语言,因此您坚持使用对 a 的引用先前指定或铸造/取消铸造的实体“示例”对象,即:

AbstractExample example = new Example();
((IExampleInterface)example).DoSomeMethodDefinedInInterface();

您的其他选择是让 AbstractExample 和 IExampleInterface 都实现一个通用接口,这样您就可以拥有即

abstract class AbstractExample : ICommonInterface
interface IExampleInterface : ICommonInterface
class Example : AbstractExample, IExampleInterface

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

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

于 2009-04-25T19:03:34.533 回答
5

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

private T SomeMethod<T>()
    where T : new(), AbstractExample, ExampleInterface
{
    T instance = new T();
    instance.SomeMethodOnAbstractClass();
    instance.SomeMethodOnInterface();
    return instance;
}
于 2009-04-25T19:00:07.380 回答
1

采用:

Example example = new Example();

更多信息后更新:

如果你确定它实现了 ExampleInterface,你可以使用

AbstractClass example = new Example();
ExampleInterface exampleInterface = (ExampleInterface)example;
exampleInterface.InterfaceMethod();

您还可以通过检查接口来确保它真正实现了它

if (example is ExampleInterface) {
    // Cast to ExampleInterface like above and call its methods.
}

我不相信泛型可以帮助你,因为它们是在编译时解决的,如果你只有对 AbstractClass 的引用,编译器会抱怨。

编辑:或多或少是欧文所说的。:)

于 2009-04-25T18:51:00.960 回答
1

我认为这个例子会帮助你:

public interface ICrud
{
    void Add();
    void Update();
    void Delete();
    void Select();
}

public abstract class CrudBase
{
    public void Add()
    {
        Console.WriteLine("Performing add operation...");
        Console.ReadLine();
    }

   public void Update()
    {
        Console.WriteLine("Performing update operation...");
        Console.ReadLine();
    }
    public void Delete()
    {
        Console.WriteLine("Performing delete operation...");
        Console.ReadLine();
    }
    public void Select()
    {
        Console.WriteLine("Performing select operation...");
        Console.ReadLine();
    }
}

public class ProcessData : CrudBase, ICrud
{

}

var process = new ProcessData();
process.Add();
于 2013-01-30T07:28:09.527 回答