2015-11-25 61 views
0

我有一個基類(A),下面,我一直想從如何從實現的類引用抽象方法在C#

class A 
{ 
    abstract protected int foo(); 

    public int foo2() 
    { 
     //do some stuff 

     foo();  
    } 

} 

繼承,因爲我不能有一個這樣可不行非抽象類中的抽象方法。但是,我怎樣才能完成以下目標:

繼承類A的類將已經實現了foo2,但繼承的類必須實現foo?也可以優先使用foo2。

更新:A類沒有是非抽象

+4

爲什麼不能抽象?做一個摘要並添加'虛擬'到foo。 – Jaster

+0

僅供參考:一個乾淨的代碼原則:支持合成而不是繼承 –

+0

您可以使用默認實現將'foo()'虛擬方法'或使用該方法創建一個新的'Interface'並使'class A'實現它。或者只是把'A類'作爲'抽象類'。 – W0lfw00ds

回答

2

只是使課堂A抽象。抽象類可以實現一些方法。

使foo2()爲虛擬,則從A派生的類可以覆蓋它。

+0

虛擬真的需要嗎?需要它和繼承者一樣有意義_必須實現它。將其變爲虛擬必須是直接具體繼承者的選擇。 – Machinarius

+0

@Machinarius'virtual'是'foo2' - 已經在'A'中實現的。這是第二個要求 - 「也可以優先考慮foo2是可覆蓋的。」 –

0

當你構建項目 你不能在非抽象類定義的抽象方法,你會收到錯誤

異常

Error 1 ' .A.foo()' is abstract but it is contained in non-abstract class 
1

我希望你有正當理由,不使A抽象。改變現有非抽象類的行爲的首選方式是inject那種行爲。

interface IFoo 
{ 
    int Foo(); 
} 

class A 
{ 
    private IFoo foo; 

    public A(IFoo foo) 
    { 
     this.foo = foo; 
    } 

    public int Foo2() 
    { 
     //... 
     return foo.Foo();    
    } 
}