2013-07-10 3 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

Я полностью согласен с тем, что перегрузка, безусловно, лучший вариант. Однако, если вы застряли с другим решением, предпочитайте, чтобы оператор был включен, это не даст вам бросать дважды. Небольшая оптимизация, но очень легко сделать один – Falanwe

+0

@Falanwe: Возможно. Я подозреваю, что эффективность достаточно тонкая, что ее более приемлемые предпочтения. Если вы хотите сделать 'else 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, чтобы быть уверенным.

Смежные вопросы