我是 C# 的新手,我有一個專案,其中有一個Task帶有派生類的父類FixedTask和RelativeTask.
FixedTask并且RelativeTask具有不同的屬性,命名不同。我需要對每個人執行一些計算Task來計算一些作業負載。
AProject包含不同的Tasks,可以是各種型別,例如FixedTask和RelativeTask。我打算做這樣的事情:
foreach (Task Task in this.Tasks)
{
switch (Task)
{
case FixedTask:
switch (Task.Frequency)
{
case "Daily":
// do some calculations
// other frequency cases
}
// other Task cases
}
但是我收到一個Task沒有特定引數的錯誤,因為它是FixedTask在RelativeTask.
雖然我認為該switch模式允許 C# 理解他必須考慮的型別,但顯然不是。
實作我想要的東西的正確方法是什么?
uj5u.com熱心網友回復:
模式匹配:case FixedTask f.
但你不應該。您的基類不應該知道也不關心派生類是如何實作的。
OO 和繼承的目的是派生類包含自己的邏輯。因此,如果您的任務運行器想要執行任務,請執行以下操作:
foreach (Task task in this.Tasks)
{
task.Execute();
}
然后每個任務派生類在它們的重寫Execute()方法中都有邏輯。
uj5u.com熱心網友回復:
模式匹配有助于:
foreach (Task Task in this.Tasks)
{
switch (Task)
{
case FixedTask ft:
switch (ft.Frequency)
{
case "Daily":
...
}
case RelativeTask rt:
switch (rt.OtherProperty)
{
case ...:
}
uj5u.com熱心網友回復:
作為快速(但不是最好的)修正,我建議使用模式匹配,即
foreach (Task task in Tasks) {
if (task is FixedTask fixedTask) {
// From now on you work with fixedTask
switch (fixedTask.Frequency) {
...
}
}
else if (task is RelativeTask relativeTask) {
// From now on you work with relativeTask
}
}
uj5u.com熱心網友回復:
您需要告訴編譯器 Task 實際上是一個 FixedTask。
....
case FixedTask:
switch (((FixedTask)Task).Frequency)
{
case "Daily":
....
這會將任務轉換為固定任務,還有其他幾種方法可以完成相同的任務 - 看看https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/casting-and -type-conversions提供了一些進一步的細節
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368690.html
