2015-02-10 52 views
2

我有這個抽象類:有沒有辦法強制派生類來實現一個抽象類或嵌套在基類中的接口?

public abstract class Task 
{ 
    public string ID {get; set;} 
    public string Name {get; set;} 
    public abstract class Options{}; 

    public abstract void Execute(); 
} 

我有擴展此類其它類:

public class Copy : Task 
{ 
    public override void Execute() 
    { 
    Console.Write ("running"); 
    } 
} 

我想每一個派生類中實現自己的選項類,以便他們可以有自己的自己的參數。

所以搜索類必須實現它自己的選項類它所需要的屬性,如「includesubfolders」,「區分大小寫」等。

同時移動任務可以實現它自己的:「覆蓋」等。

在一個抽象類中抽象強制der派生類實現它們自己,但是在同一個類中定義一個嵌套的抽象類或接口不會強制派生類實現它們自己的派生類。

我可以在每個派生類分別定義的每個屬性但失敗的目的,因爲我喜歡查詢後在Execute方法中Task.Options的屬性。

我也嘗試過動態對象,但這帶來了其他所有問題。

+0

的*抽象*嵌套類,這就是爲什麼我們不能有好東西...... – BradleyDotNET 2015-02-10 21:52:12

+0

你能請出示'Options'類是如何使用的例子在抽象基類「Task」中?如果沒有這種情況,你不需要在基類中聲明它。 – 2015-02-10 21:54:46

+0

否。嵌套類更像命名空間,這就是爲什麼你不能執行實現。使用非嵌套類實現'Task.Options'完全合法! – 2015-02-10 21:57:28

回答

2

您可以使用一個通用的

public abstract class Options{}; 

public class CopyOptions : Options 
{ 
} 

public abstract class Task<T> where T : Options 
{ 
    public string ID {get; set;} 
    public string Name {get; set;} 

    public T Options { get; set; } 

    public abstract void Execute(); 
} 

public class Copy : Task<CopyOptions> 
{ 
    public override void Execute() 
    { 
     Console.Write("running"); 
    } 
} 
+0

我喜歡這個,它在我的問題中提出了問題。它創建另一個問題,這是[這裏](http://stackoverflow.com/q/9140873/3481709)提到,它仍然回答我的問題。 – PersyJack 2015-02-16 15:52:33

1

您不能強制嵌套類實現,但你可以添加一個財產的選項:

public abstract class Task 
{ 
    public string ID {get; set;} 
    public string Name {get; set;} 
    public Options Options {get; set;} 
    public abstract void Execute(); 

    public abstract class Options{}; 
} 

但是沒有辦法執行的Options類的實現嵌套內實現Task的類。

+2

實際上,你可以通過將'Options'類強制爲'protected'而不是'public'來嵌套,但是這會消除在Task和它的後代之外使用'Options'類的能力。 – 2015-02-10 22:01:38

相關問題