在方法参数中区分基类和派生类

时间:2016-08-22 20:33:23

标签: c# overloading constructor-overloading

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

<div class="searchField">
Start Date<br>
<input type="text" name="start_date" id="start_date" value="06/28/2014" placeholder="Start Date" class="datepicker hasDatepicker">
</div>

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

4 个答案:

答案 0 :(得分: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();    
}

答案 1 :(得分: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");
    }

}

答案 2 :(得分: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

答案 3 :(得分:0)

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

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