2013-07-10 50 views
2

以下代码对象:向下转换到执行

ClassA myClass = new ClassA() 
myClass.varA = "Teststring" 

BaseClassB cls = new BaseClassB() 
cls.methodA(myClass) 

我有以下类

class BaseClassA 
{ 

} 

class ClassA:BaseClass 
{ 
    string varA; 
} 

class ClassB:BaseClass 
{ 
    string varB; 
} 

然后一个方法

class BaseClassB 
{ 
    public void methodA(BaseClassA myVar) 
    { 
     // How can I display varA that is given with myClass (which is myVar)? 
     // It should also be able to display varB when an object of type ClassB is given 
     // So I have to make a downcast here but I don't know if I have to downcast to ClassA or ClassB 
    } 
} 

我知道这是主要的知识,而且可以有人帮忙我?

+0

在这种特定情况下,你最好将'string'成员移到基类中的一个成员 - 解决问题。 –

+0

我知道,但我不能改变任何事情发生的地方。我让这个例子尽可能简单,使它成为克莱尔。 – Ozkan

回答

7

您可能想要重构您的代码,而不是将代码放在您指定的位置。基类的全部意义在于您可以将ClassA和ClassB视为相同。如果你想以不同方式对待他们,那么有需要ClassA和ClassB的对象重载...

class BaseClassB 
{ 
    public void methodA(ClassB myVar) 
    { 
     Console.WriteLine(myVar.varB); 
     methodCommon(myVar); 
    } 
    public void methodA(ClassA myVar) 
    { 
     Console.WriteLine(myVar.varA); 
     methodCommon(myVar); 
    } 
    public void methodCommon(BaseClassA myVar) 
    { 
    } 
} 

,如果你真的需要它的一个方法,那么你可以这样做:

public void methodA(BaseClassA myVar) 
{ 
    if (myVar is ClassA) 
    { 
     //Its of type ClassA so you can do whatever you want with it knowing it is a ClassA. 
    } 
    else if (myVar is ClassB) 
    { 
     //Its of type ClassB so you can do whatever you want with it knowing it is a ClassB. 
    } 
    else 
    { 
     //Its not either. 
    } 
} 
+1

我完全同意有超载显然是更好的选择。但是,如果你坚持使用另一种解决方案,那么更喜欢as运算符,它会阻止你必须施放两次。一个微小的优化,但很容易做一个 – Falanwe

+0

@Falanwe:也许吧。我怀疑效率是否足够渺茫,以至于更偏向于可读性偏好。如果你想做'别人如果'你没有机会重新分配在中间。我个人发现,在这样的情况下,如果在顶层,没有其他代码比单独使用if语句时有点整齐。它主要是一个偏好问题,虽然我想,但绝对值得评论。 – Chris

2

如果您确信myVar的或者是ClassA的或ClassB的,你可以这样做:

string s; 
var myvarA = myVar as ClassA; 
if (myvarA != null) 
{ 
    s = mayVarA.varA; 
} 
else 
{ 
    s = ((myvarB)myVar).varB; 
} 

如果myVar的可能是别的东西,你可以做同样的测试比ClassA的对ClassB的是肯定的。