簡體   English   中英

類都擴展了抽象類並實現了接口

[英]Class both extends an abstract class and implements an interface

如果我有一個擴展抽象類並實現接口的類,例如:

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

如何初始化這個類,以便我可以從接口和抽象類訪問方法?

當我做:

AbstractExample example = new Example();

我無法從界面訪問方法。

你需要

  • 在AbstractExample中實現接口
  • 或者獲得對Example的引用

Example example = new Example();

最后一個例子將你綁定到一個接口或抽象類的實體實例,我認為這不是你的目標。壞消息是你不是在這里使用動態類型的語言,所以你堅持要么引用一個固定的“示例”對象,如先前的sprcified或cast / uncasting,即:

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

你的其他替代方法是讓AbstractExample和I​​ExampleInterface都實現一個通用接口,這樣你就可以了

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

現在,您可以使用ICommonInterface,並具有抽象類和IExample接口實現的功能。

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

如果您只知道抽象類,則表明您通過Type實例知道實際Type 因此,您可以使用泛型:

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

我想這個例子可以幫助你:

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();

使用:

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.
}

我不相信Generics會幫助你,因為那些解析了編譯時間,如果你只引用了AbstractClass,編譯器就會抱怨。

編輯:歐文所說的或多或少。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM