我以爲我有這個釘子,然後我去看看工作中的某些源,並且想知道爲什麼我從msdn讀取的內容和我在源代碼中看到的內容中存在如此多的矛盾。 ...C#虛擬&覆蓋關鍵字
我的理解是,虛擬關鍵字可以在方法聲明中使用,以允許任何派生類來覆蓋它。然後
override關鍵字將需要在執行超類的虛擬方法,當派生的類中使用....
例如:
public abstract class A
{
public virtual string GetName();
}
public class B:A
{
//assume there are some defined properties.
public override string GetName()
{
return FirstName;
}
}
我有幾個問題:
1)如果沒有實現方法,是否真的需要定義一個虛擬方法?當然它可以被覆蓋在子類中而不使用虛擬和覆蓋?
2)如果(1)不正確,我是正確的思維,每一個虛擬方法必須在子類中使用它來覆蓋....
編輯:
你說得對我的代碼不會編譯......我想知道爲什麼....我uinderstand你的答案,但後來我看到了這一點:
public abstract class RequestHandler<TRequest, TResponse> : RequestHandler, IRequestHandler<TRequest>, IRequestHandler, IDisposable, ITypedRequestHandler
where TRequest : global::Agatha.Common.Request
where TResponse : global::Agatha.Common.Response, new()
{
protected RequestHandler();
public virtual void AfterHandle(TRequest request);
public virtual void BeforeHandle(TRequest request);
public override Response CreateDefaultResponse();
public TResponse CreateTypedResponse();
public override Response Handle(Request request);
public abstract Response Handle(TRequest request);
}
以上不導致編譯器抱怨......
您的示例沒有編譯(「'A.GetName()」必須聲明一個主體,因爲它沒有被標記爲'abstract','extern'或'partial'「)。 – dtb 2012-02-23 11:08:51
您的A級人員會編寫它缺少的摘要嗎? – V4Vendetta 2012-02-23 11:09:48
當然A類中的方法應該是public abstract string GetName(); – Vedran 2012-02-23 11:11:33