[英]Distinguishing base and derived classes in method arguments
是否有可能在C#中重載構造函數,以便如果參數是派生類的,則程序選擇使用一個構造函數,如果是基類,則選擇另一種構造函數。 例如
class BaseClass {...}
class DerivedClass : BaseClass {...}
class foo
{
public foo(DerivedClass bar)
{
//do one thing
}
public foo(BaseClass bar)
{
//do another
}
}
也就是說,我希望程序根據對象類型選擇正確的構造函數。
我認為對您問題的最佳答案有點間接,但是對您問題的最佳最近答案應該是這樣的:
編輯:更正不正確is
語法用法,並使它更具體
public foo(BaseClass foobar) {
if (foobar?.GetType() == typeof(BaseClass)) {
//do something
}
else { // do something different }
}
話雖這么說,但我認為這不一定是構造代碼的最佳方法。 根據對象類型做出決策可能是一個信號,表明該是通過抽象/虛擬類和方法利用多態性的時候了。 最好讓 IMO做這樣的事情:
public BaseClass {
public virtual void DoSomething() {...}
}
public DerivedClass : BaseClass {
public override void DoSomething() {...}
}
public foo(BaseClass foobar) {
foobar.DoSomething();
}
我與其他所有人都同意,這聽起來像是代碼的味道,但是如果您實際上編譯代碼並運行它,您會發現它已經可以按照您希望的方式工作。 例如,無論您做的好與壞,這確實可以滿足您的要求。
class Program
{
static void Main(string[] args)
{
var b = new BaseClass();
var d = new DerivedClass();
var f = new foo(d);
//prints Derived Constructor
var e = new foo(b);
//prints Base Constructor
}
}
public class BaseClass {
public BaseClass()
{
}
}
public class DerivedClass : BaseClass
{
public DerivedClass()
{
}
}
class foo
{
public foo(DerivedClass bar)
{
//do one thing
Console.WriteLine("Derived Constructor");
}
public foo(BaseClass bar)
{
Console.WriteLine("Base Constructor");
}
}
如果在BaseClass中強制轉換對象,則將調用良好的構造函數。 像這樣:
void Main()
{
var object2 = new DerivedClass();
var temp = new Allo((BaseClass)object2);
}
public class Allo
{
public Allo(BaseClass value)
{
Console.WriteLine("baseclass");
}
public Allo(DerivedClass value)
{
Console.WriteLine("derivedclass");
}
}
public class BaseClass
{
}
public class DerivedClass : BaseClass
{
}
輸出:
baseclass
當我編寫上面所示程序的簡單版本時,在使用派生類調用構造函數時,它確實正確選擇了派生類方法。
[當我作為較大項目的一部分進行測試時,我的行為很奇怪……但是我現在意識到那是由於我的代碼中的其他錯誤-提醒我自己實際進行測試-這是我四年來第一次已經完成了任何編程,所以我忘記了基礎知識...]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.