2016-08-22 29 views
-1

是否有可能在C#中重载构造函数,以便程序在参数是派生类时选择使用一个构造函数,如果它是基类,则选择不同的构造函数。例如区分方法参数中的基类和派生类

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

class foo 
{ 


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

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

} 

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

+0

你试过了吗? – Blorgbeard

+2

这有一个非常糟糕的代码气味,好像你可能试图违反https://en.wikipedia.org/wiki/Liskov_substitution_principle – itsme86

+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();  
} 
+0

多态性的具体技术,我认为你要使用的是单一调度的能力:https://en.wikipedia.org/wiki/Single_dispatch –

+1

如果(foobar是typeof(BaseClass))'不是一个有效的语法,你可以使用'if(foobar是BaseClass)',但如果运行时的'foobar'有任何派生自'BaseClass'的类型,那么这就是真的。鉴于编译时类型,这在实践中确实是一个空检查。你也可以尝试像'if(foobar?.GetType()== typeof(BaseClass))'这样的精确匹配的东西。最后,考虑'if(foobar是DerivedClass)'还是声明一个变量'var dc = foobar作为DerivedClass;',并在'if'语句中检查它是否为'null'。 –

+0

@jeppestignielsen - 很好的观察。我的主要观点是指导OP更多样化的解决方案;我会用您的反馈更新我的答案 –

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

} 
0

当我写程序的简单版本如上图所示,它并选择正确的派生类方法时的构造与派生类调用。

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