-1

是否可以在 C# 中重载构造函数,以便程序在参数属于派生类时选择使用一个构造函数,如果是基类则选择使用不同的构造函数。例如

class BaseClass {...}
class DerivedClass : BaseClass {...}

class foo
{


      public foo(DerivedClass bar)
      {
          //do one thing
      }

      public foo(BaseClass bar)
      {
          //do another
      }

}

也就是说,我希望程序根据对象类型选择正确的构造函数。

4

4 回答 4

1

我认为您问题的最佳答案有点间接,但您问题的最佳近似答案将是这样的:

编辑:更正不正确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();    
}
于 2016-08-22T20:41:58.107 回答
1

我同意其他所有人的观点,这感觉就像是代码异味,但如果您实际编译并运行代码,您会发现它已经按照您想要的方式运行。例如,这完全符合您的要求,无论好坏。

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");
    }

}
于 2016-08-22T20:45:55.930 回答
0

如果你在你的 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
于 2016-08-22T20:42:53.633 回答
0

当我编写上面显示的程序的简单版本时,当使用派生类调用构造函数时,它确实正确地选择了派生类方法。

[当我作为我的大型项目的一部分进行测试时,我的行为变得奇怪......但我现在意识到这些是由于我的代码中的其他错误 - 提醒自己实际测试东西 - 这是四年来我第一次'做过任何编程,所以我忘记了基础知识......]。

于 2016-08-22T20:47:28.797 回答