簡體   English   中英

在方法參數中區分基類和派生類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM