2009-04-25 187 views
4

如果我有兩個擴展一個抽象類,實現了一個接口,例如一類:類都擴展一個抽象類,實現了接口

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

我怎麼能初始化這個類,所以我可以訪問來自接口和抽象類的方法?

當我這樣做:

AbstractExample example = new Example(); 

我無法訪問從接口的方法。

回答

5

的最後一個例子將配合你無論是接口或抽象類,我相信了堅實的實例是不是你goal.The壞消息是你在一個動態的不是類型化的語言在這裏,所以你堅持了既具有堅實的「示例」對象的引用,以前sprcified或鑄造/ uncasting即:

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

您的其他alternitives是同時擁有AbstractExample和I​​ExampleInterface實現一個共同的接口,這樣你會有,即

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

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

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

+0

謝謝你的兩個答案都非常有用;) 我對C#有點困惑,因爲我來自PHP/Zend,它的語言非常不同。 – 2009-04-25 19:08:44

+0

是的,我認爲很多人也來自這個背景(包括我在內)。您可以使用靜態語言進行操作,反之亦然。要做的最好的事情就是了解差異,看看線條可以略微模糊。 .NET 3.5引入了一些強大的功能,使語言變得「充滿活力」,Kent Boogaart的解決方案是一個很好的開始,可能在沒有額外界面的冗長的情況下獲得您需要的功能。 – Owen 2009-04-25 19:13:21

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,編譯器會抱怨。

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

+0

謝謝。 但是如果我不知道對類的引用,我只知道它擴展了哪個抽象類以及它實現了哪個接口? Richard – 2009-04-25 18:55:31

10

您需要

  • 實現該接口在AbstractExample
  • 或得到例

Example example = new Example();

5

的引用。如果你只知道抽象類,它建議你通過Type的實例知道實際的類型。因此,你可以使用泛型:

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

真的很喜歡這個答案,現在你已經開始思考如何進一步採用這個解決方案了。 – Owen 2009-04-25 19:08:57

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(); 
相關問題