我正在嘗試創建一個簡單的服務,派生類可以通過傳入自己的物件來覆寫虛擬方法。似乎無法正確使用語法。請看下面的代碼:
所以基類如下:
public class FooBase
{
public virtual Task StartFooAsync<TParam>(TParam param) where TParam : IFooParam
{
Console.WriteLine(param.GetType());
return Task.CompletedTask;
}
}
和IFooParam界面:
public interface IFooParam
{
public string Title { get; set; }
}
實作這個簡單介面的類是:
public class FooParam : IFooParam
{
public string Title { get; set; }
}
現在,當我嘗試將 FooBase 類繼承為:
public class FooOne : FooBase
{
public override Task StartFooAsync(FooParam param) // wont compile :(
{
return base.StartFooAsync(param);
}
}
我收到編譯時錯誤,告訴我沒有合適的方法可以覆寫StartFooAsync
這里的目標是從FooBase 類繼承并提供自己的實作,并將其首選型別作為引數StartFooAsync
uj5u.com熱心網友回復:
不,如果虛擬方法是泛型方法,則覆寫也必須如此。泛型方法允許呼叫者指定型別引數。
這是您的代碼無法運行的示例......這應該是完全有效的:
class OtherParam : IFooParam
{
public string Title { get; set; }
}
FooBase x = new FooOne(); // FooOne derives from FooBase
var p = new OtherParam { Title = "xyz" };
x.StartFooAsync<OtherParam>(p);
宣告中沒有任何內容FooBase可以阻止編譯...但是您還沒有提供StartFooAsync可以處理的實作OtherParam。
一種替代方法是改為FooBase通用:
public class FooBase<TParam> where TParam : IFooParam
{
public virtual Task StartFooAsync(TParam param)
{
...
}
}
然后你FooOne會派生自FooBase<FooParam>. 這將防止我之前顯示的損壞代碼,因為x將被宣告為FooBase<FooParam>or FooOne,并且該StartFooAsync方法將只接受FooParam。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452584.html
上一篇:PackageReference更新和PackageReference包含有什么區別?
下一篇:C#函式回傳值后不停止
