是否可以在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>
也就是说,我希望程序根据对象类型选择正确的构造函数。
答案 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)
当我编写上面显示的程序的简单版本时,它在使用派生类调用构造函数时正确选择了派生类方法。
[当我作为我的大型项目的一部分进行测试时,我的行为变得异常......但我现在意识到这些是由于我的代码中的其他错误 - 提醒我自己实际测试的东西 - 这是第一次四年我做了任何编程,所以我忘记了基础......]。