2009-12-16 197 views
13

如果我問一些愚蠢的東西,我很抱歉,但我完全是C#和ASP.NET中的新手。 我的代碼有錯誤,我不明白。 我上的Visual Studio 2008C#類沒有實現繼承的抽象成員

工作在這行代碼:

public class SQLFAQProvider : DBFAQProvider 

我收到此錯誤:當我去DBFAQProvider錯誤

Moby.Commerce.DataAccess.FAQ.SQLFAQProvider does not implement inherited abstract member Moby.Commerce.DataAccess.FAQDBFAQProvider.DeleteFAQbyID(int)

是在這一行的代碼:

public abstract DBFAQ DeleteFAQbyID(int fAQID); 

我應該改變什麼來糾正它?

回答

19

首先想到的是實現繼承的類阿拉抽象成員:

public override DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    // Put your code here 
} 

抽象方法的要點是說:

public class SQLFAQProvider : DBFAQProvider 
{ 
    public override DBFAQ DeleteFAQbyID(int fAQID) 
    { 
     //TODO: Real Code 
     return null; 
    } 
} 
+5

當抽象成員必須實現時,它對我來說沒有意義,它需要override關鍵字。 – DFTR 2015-01-06 21:20:23

+2

IMO在具體類中正確要求'override'關鍵字,因爲抽象成員可以在派生於具體類的類中被進一步覆蓋。否則,它看起來像派生類的成員覆蓋了非虛擬或非抽象成員。此外,CLR必須能夠區分抽象成員的實現和隱藏抽象成員的潛在新成員。那麼真正的問題是爲什麼不允許這樣做,即爲了同時覆蓋和隱藏一個成員(無論是抽象的還是虛擬的),因爲不會有歧義。 – GDS 2015-08-21 22:59:34

1

您的子類(SQLFAQProvider)必須爲方法DeleteFAQbyID提供實現代碼,因爲父類(DBFAQProvider)沒有。

20

在派生類實現DeleteFAQbyID方法(在抽象基類中),「我想確保這個方法在每一個派生自我的具體類中都可用」 - 這取決於你提供的實現。這有點像界面中的方法。

+0

我想換句話說「我想確保這種方法在每個從我派生的具體類中都可用」到「我想確保從我派生的每個具體類都實現了此方法的自定義特定邏輯」 – bradbury9 2017-04-27 14:58:44

2

當一個類繼承自一個抽象類時,它必須實現由該類定義的所有抽象方法。這是類接口,抽象方法可以被認爲是純虛函數,即必須由後代類實現的函數,但在基類中實現是沒有意義的。

9

你的子類需要明確地實現該特定的方法。

如果你不知道如何做到這一點,那麼至少要做到:

public override DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    throw new NotImplementedException("This isn't done yet"); 
} 
2

因爲你SQLFAQProvider類不是abstract,它必須實現每abstract方法,它繼承。

爲了解決這個問題,實現DeleteFAQbyID方法SQLFAQProvider,像這樣:

public override DBFAQ DeleteFAQbyID(int fAQID) { 
    //Do something 
} 

或者,你可以通過改變其聲明public abstract class SQLFAQProvider讓你SQLFAQProviderabstract類。

3

當您從C#中的類繼承時,您需要實現標記爲abstract的所有方法,除非您的類本身標記爲abstract。抽象類是那些在運行時不能直接實例化的類,因爲它們沒有完全實現基類必須存在的所有必需方法。

抽象方法是一種機制,它允許類指示特定的方法必須「最終」存在 - 而不必在此時提供實現。當你不能或不想指定特定的實現應該做什麼時,你通常使用抽象類,但是你需要預先定義一個你最終依賴的方法。

要在班級解決您的問題,或者你的類爲抽象(與預期繼承的另一個層面將遺漏的部分補)或實施DeleteFAQbyId():

public DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    // write appropriate implementation here or: 
    throw new NotImplementedException(); 
    // or possibly NotSupportedException() if the operation should can't ever be supported. 
} 
+3

請注意,按順序要實現一個方法,必須聲明它爲「覆蓋」,否則錯誤將會持續 – 2012-08-10 19:44:35

-2

在抽象類使用像IsValid這樣的實體屬性。讓它返回想要在派生類中重寫的抽象方法。

在抽象基類:

public bool IsValid 
{ 
    get 
    { 
     return DeleteFAQbyID(); 
    } 
} 

public abstract bool DeleteFAQbyID(); 

在派生類現在它將覆蓋抽象類的方法。