2011-12-27 17 views
0
private void SomeMethod(DerivedA something) {...} 
private void SomeMethod(DerivedB something) {...} 
private void SomeMethod(DerivedC something) {...} 


BaseClass bc = somevariable; 
if (bc is DerivedA) Somemethod(bc as DerivedA) 
else if (bc is DerivedB) Somemethod(bc as DerivedB) 
else if (bc is DerivedC) Somemethod(bc as DerivedC) 
... 
else if (bc is DerivedZZ) Somemethod(bc as DerivedZZ) 

在.NET 3.5中,必須有一個更簡單的方法,不是嗎?更簡單的方法來檢查和調用過載的方法

+0

SomeMethod是對象應該做的事情還是外部力量對對象做的事情? –

+0

爲了澄清,我正在使用的類不是DerivedX,而是作用於DerivedA ... DerivedZ並調用方法來做不同的事情。基本上,我試圖避免一個大的switch語句(或if/else)並決定執行SomeMethod(派生A)。我可以完成SomeMethodActOnDerivedA,SomeMethodActOnDerivedB等。將它想象成具有各種用戶控件的頁面,並且這些用戶控件具有共享的基類,但需要分別填充和採取行動。 –

+0

也許typeof()可以爲你做這項工作? –

回答

4

將SomeMethod設置爲類的成員方法不合適嗎?

如果DerivedA,DerivedB等...都共享相同的父代,那麼您可以在父類中創建此方法作爲虛擬成員方法,並在從中繼承的類中覆蓋它。 (這不是專門針對.NET 3.5 - 或任何其他.NET版本whatsoever-,這僅僅是基本的OOP特性之一)

像這樣:

public class BaseClass 
{ 
    public virtual void SomeMethod() 
    { 
     Console.WriteLine ("BaseClass"); 
    } 
} 

public class DerivedA : BaseClass 
{ 
    public override SomeMethod() 
    { 
     Console.WriteLine("DerivedA"); 
    } 
} 

public class DerivedB : BaseClass 
{ 
    public override SomeMethod() 
    { 
     Console.WriteLine ("DerivedB"); 
    } 
} 

BaseClass bc = someVariable; 

bc.SomeMethod(); 
+0

+1。或甚至使其在基地抽象... – Cameron

+0

同意;多態性似乎是一個很好的候選人 –

+0

請參閱上面的註釋。我正在使用的類不是派生的,而是對派生對象起作用 –

1
public class BaseClass { 
    public virtual void SomeMethod() 
    { 
    } 
}; 

public class DerivedA : BaseClass { 
    public override void someMethod() 
    { //Do DerivedA things 
    } 
}; 
public class DerivedB : BaseClass { 
    public override void someMethod() 
    { //Do DerivedB things 
    } 
}; 
public class DerivedC : BaseClass { 
    public override void someMethod() 
    { //Do DerivedC things 
    } 
}; 

然後,你可以做:

BaseClass bc = new BaseClass(); 

BaseClass bc = new DerivedA(); 

BaseClass bc = new DerivedB(); 

BaseClass bc = new DerivedC(); 

,只是稱:

bc.SomeMethod(); 

即使是BC類型是BaseClass的,如果實例爲派生,衍生方法將被調用。這意味着繼承和多態。

此代碼與您的等號相同。

即使是你的,你可以更好地使用typeof(); ;)

+0

請參閱上面的註釋。我正在使用的課程不是派生的,而是基於派生的對象 –

0

這聽起來像你需要對你如何做事情有一個輕微的反思;如果你有一些其他類需要使用這個BaseClass,不知道它包含的派生類是什麼類型,直到你調用一個方法,這似乎效率低下。

public abstract class BaseClass 
{ 
    public abstract void InitializeAndDoOtherStuff(); 
} 

public abstract class DerivedA 
{ 
    public overload void InitializeAndDoOtherStuff() 
    { 
     // Initializes the control, pass whatever you need into this method, etc) 
    } 
} 

在這種情況下,你的代碼看起來像這樣:

BaseClass bc = someVariable; 
bc.InitializeAndDoOtherStuff(); 

OR

這是代碼管理的角度來看一個可怕的想法,但你可以做這樣的事情:

public class DerivedA : BaseClass, IControlA { } 
public class DerivedB : BaseClass, IControlB { } 
... 

然後你的其他類有過載就像這樣:

public void SomeMethod(IControlA control) { } 
public void SomeMethod(IControlB control) { } 
... 

然後,在你的代碼這將是一樣容易:因爲相應的接口只有一個派生類

BaseClass bc = someVariable; 
SomeMethod(bc); 

和超載決議將照顧它。

0

我還要去重新設計已經說明別人喜歡你的課,但是如果你不能做到這一點,你可以使用反射來完成這項工作

this.GetType().InvokeMember("SomeMethod", // Method name 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, 
    null, // DefaultBinder 
    this, // object to call the method on 
    new[]{ bc } // parameters to the method 
    ); 

如果的someMethod不是公共實例方法,您需要相應地調整BindingFlags。

+0

我不能重新設計其他人決定以他們選擇的方式做的課程。基於我的原始問題,知道我無法更改其他人的代碼,是否有任何可以做到的改善這一點的方法? –

+0

那麼,如果你不能改變現有的代碼,要麼爲現有的代碼編寫你自己的抽象層,要麼這是你唯一的想法,使用反射來保存一些輸入 – kev

相關問題