2014-01-28 3 views
1

Я просмотрел похожие темы, и все они относятся к C++, поэтому я предполагаю, что лучше спросить, чем просто шарить. У меня, например, этот код:Как получить доступ к производному классу из массива базового класса?

foo[] fooArray = new foo[5]; 
fooArray[2] = new bar(); 

Говорят, что foo является пользовательский класс без каких-либо переменных/методов:

public class foo 
{ 

} 

и bar является пользовательский класс, производный от foo:

public class bar : foo 
{ 
    int fooBar = 0; 
} 

В моем fooArray мне нужно получить доступ к переменной fooBar от fooArray[2], что является bar, но поскольку переменная не отображается в базовом классе, она не отображается в массиве foo s. Есть ли способ получить к нему доступ?

Редактирование: В коде приложения оба foo и bar имеют необходимые конструкторы и другие параметры.

+0

Вы не можете. Тем не менее, вы можете повысить поле до базового класса. –

+2

Думаю, вам нужно пересмотреть свой дизайн. Что делать, если у вас есть десятки производных классов, каждый со своими собственными свойствами ... –

ответ

0

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

bar barVar = (bar)fooArray[2]; 
int fooBarInt = barVar.fooBar; 

Или используйте оператор as рассматривать объект как тип bar,

bar barVar = fooArray[2] as bar; 
if (barVar != null) 
{ 
    // user barVar.fooBar; 
} 

Однако способ, который он определяет в вашем примере fooBar, равен private. Вам нужно будет сделать это public, чтобы получить доступ к нему за пределами класса.

public class bar : foo 
{ 
    public int fooBar = 0; 
} 
+0

Спасибо за помощь! Ваше решение отлично работало. Кроме того, fooBar был общедоступным в моем коде приложения, просто забыл ввести его :) – ApachePilotMPE

0

Поскольку foo класс не fooBar field.You не может получить к нему доступ, если вы не отбрасывают переменную в Bar:

fooArray[2] = new bar(); 
var value = ((bar)fooArray[2]).fooBar; 

Примечание: fooBar поле должно быть общественные .полей являются частные по умолчанию.

+1

Что-то ** очень-очень сильно ** неправильно с вашим дизайном, если вам нужно это сделать. –

+0

Я не понимаю, что Саймон: D Не могли бы вы, пожалуйста, более ясно? в этом случае он должен бросить его, но из-за использования интеркафа лучше. –

+0

@SimonWhitehead Ваш комментарий действительно принадлежит самому OP. – rae1

0

Для того, чтобы получить доступ к его вам нужно будет привести значение к bar например

int i = ((bar)fooArray[2]).foobar; 

Обратите внимание, что если fooArray[2] не на самом деле экземпляр bar этот код будет сгенерировано исключение. Если вы хотите сделать это, только если fooArray[2] это bar затем сделайте следующее

bar b = fooArray[2] as bar; 
if (b != null) { 
    int i = b.foobar; 
    ... 
} 
1

Вы могли бы бросить. Чтобы быть в безопасности, вы должны использовать ключевое слово as:

bar b = fooArray[2] as bar 
if (b != null){ 
    //Do stuff with b.foobar 
} else { 
    //Handle the case where it wasn't actually a bar 
} 
Смежные вопросы

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