2017-02-22 100 views
-1

這裏的情況。我有一個類和派生類限制傳遞派生類的實例作爲方法參數

public class MyClass 
{ } 

public class MyDerivedClass : MyClass 
{ } 

同時,我有一種方法(在外部類),它利用了MyClass一個實例作爲參數:

public class AnotherClass { 
    public void DoSomething(MyClass myClass) 
    { } 
} 

我怎樣才能限制DoSomething方法僅接受MyClass的實例,但不接受MyDerivedClass的實例?

+5

你爲什麼要這麼做? – Philippe

+0

你不能。您可以在運行時檢查類型和拋出一個異常,但沒有編譯器可以防止 – pinkfloydx33

+3

是對面向對象的編程什麼你問,*** MyDerivedClass ** ** IS MyClass的***。這就像「我不想要一輛車,但我想要一輛法拉利!」 – Esko

回答

1

如果這是你需要的代碼來檢查自己,如果它是一個派生類型通過異常告訴調用代碼派生類型的對象是不允許這種方法,你想那什麼:

public class AnotherClass { 
    public void DoSomething(MyClass myClass) 
    { 
     if(myClass.GetType() != typeof(MyClass)) 
     { 
      throw new Exception("Derived objects not allowed"); 
     } 
    } 
} 
+0

儘管我不會推薦OP想要的內容(出於同樣問題的意見),但這是正確的方法來滿足OP(不常見)請求。 – casperOne

+0

如果此問題應該標記爲正確的答案被認爲是不被推薦的做法? –

+0

@AntonVoronin如果它回答了問題的答案,並且答案解決了這個特定的問題,那麼在接受它的過程中沒有傷害:) –

1

你想在這裏做什麼更關係到一個在所有編程語言中很常見的不變性問題。

意味着你可以只使用最初指定的類型;所以一個 不變一般類型參數既不是協變也不 逆變。不能IEnumerable的 (IEnumerable的)的實例分配給 IEnumerable類型或反之亦然的變量。

這裏是你https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx

我的建議的參考,嘗試改變的實施,並把所有的方法變成一個接口,這應該是比較清楚

class Root: Interface 
{ 
...implementation of your common methods 
} 

class Derived: Interface 
{ 
    ...implementation of your common methods 
    //this should just 
    public void DoSomething(MyClass myClass) 
} 

如果你不」要使用上述方法,然後使用「as」運算符將您傳遞的參數作爲MyRootClass,var a = parameter as MyRootClass進行處理。如果是那麼你是不正確的值傳遞給方法,或者檢查是否有直接的類型。

如果建議您閱讀本主題:

http://amapplease.blogspot.com/2009/04/invariance-covariance-contravariance.html https://stackoverflow.com/a/13107168/819153 https://blogs.msdn.microsoft.com/ericlippert/2009/03/19/representation-and-identity/

希望這有助於

相關問題