不幸的是,我找不到導致我這個問題的原始項目。這可能會讓這個問題更具體一些。繼承最衍生類型的抽象類
編輯:我發現,原來的項目,我已經看到了這一點:與一個具體的實現http://mews.codeplex.com/SourceControl/changeset/view/63120#1054567:http://mews.codeplex.com/SourceControl/changeset/view/63120#1054606
可以說我有一個抽象類的具體實現,做有用的東西,如:
abstract class AbstractClass
{
public virtual int ConvertNumber(string number)
{
string preparedNumber = Prepare(number);
int result = StringToInt32(number);
return result;
}
protected abstract string Prepare(string number);
protected virtual int StringToInt32(string number)
{
return Convert.ToInt32(number);
}
}
sealed class ConcreteClass : AbstractClass
{
protected override string Prepare(string number)
{
return number.Trim();
}
public override int ConvertNumber(string number)
{
return base.ConvertNumber(number);
}
}
這是最基本的了。現在,在代碼中我已經看到了網絡筆者從最派生類型繼承抽象類實現繼承,e.g上:
abstract class AbstractGenericClass<TGenericClass>
where TGenericClass : AbstractGenericClass<TGenericClass>
{
public virtual int ConvertNumber(string number)
{
string preparedNumber = Prepare(number);
int result = StringToInt32(number);
return result;
}
protected abstract string Prepare(string number);
protected int StringToInt32(string number)
{
return Convert.ToInt32(number);
}
}
sealed class ConcreteGenericClass : AbstractGenericClass<ConcreteGenericClass>
{
protected override string Prepare(string number)
{
return number.Trim();
}
public override int ConvertNumber(string number)
{
return base.ConvertNumber(number);
}
}
現在爲什麼會一個做這樣的事情?我非常隱約地記得,這是一種在性能方面大量使用ATL的技術(某種方式調用具體成員實現而不使用vtable?)我對這部分不太確定。
我檢查了兩種情況下生成的IL,它們完全一樣。
誰能向我解釋這一點?
我不認爲你的代碼的第一部分編譯。 'public override int ConvertNumber(string number)''但是沒有這樣的方法可以在基類型中覆蓋。 –
我猜不能這樣做? http://pastebin.com/BgpuKYb7 – Zenwalker
@DannyChen:你的權利,我已經改變了一些代碼的標記,我現在修復它。問題仍然存在 – Polity