2015-03-15 2 views
0

Я считаю, что этот вопрос довольно простой, но мне трудно найти ответ на этот вопрос. В C#, скажем, у меня есть 3 класса: A, B, CC# Upcasting/Polymorphism Issue

B вытекает из

C происходит от B

Теперь, если я хочу, список или массив объектов класса типа А, но хотел массив быть в состоянии дом объектов типа B и C это не проблема ... Я мог бы сделать что-то вроде этого:

A[] myArrayofAtypes; 

Однако давайте говорить, что я сделать первый элемент массива типа C. Если тип C имеет переменная, определенная в определении класса, ТОЛЬКО ex ists в определении класса класса ... как мне получить доступ к этой переменной из массива? Я не могу просто сделать A[0].MyVariableGetter, так как эта переменная не существует в базовом классе, A.

Любые предложения?

+0

создание массива A [] и проведение там все не polymophism –

+0

Мой вопрос был факторы, относящиеся к полиморфизму, так что я понял, отметив, что как категория вопроса уместно. Кроме того, я никогда не говорил о создании массива A [] и держал все, что было полимофисом. –

+0

ваш вопрос о кастинге и наследовании .. как только вы проверяете тип объекта, вы не являетесь полиморфным –

ответ

1

Вы должны опущенными это:

C c = (C)myArrayofAtypes[0]; 
var v = c.MyVariableGetter; 
+0

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

+0

100 элементов? Неа. Более десяти тысяч? Возможно. – mcy

+0

@BradMash проверить [это] (http://stackoverflow.com/questions/305755/what-is-the-performance-hit-with-downcasting). – dario

0

Вы должны ввести брось набрать с и получить доступ к элементу.

If (arr[i] is c) 
{ 
    ((C)arr[0]).member = value; 
} 
0

Вместо литья, как «king.code» предложил, как это я хотел бы использовать эти клевые операторы C#, которые являются «есть» и «как».

public void CallIfTypeC(A a) 
{ 
    if (a is C) 
    { 
     C c = a as C; 
     c.DoAction(); 
    } 
} 
+0

Это имеет смысл, но позвольте мне спросить вас об этом ... могу ли я сделать downcasting, обновить A [0] в моем примере (обновить специальные переменные класса C этого экземпляра) и обновить этот экземпляр в массиве? Имеет ли это смысл? –