2014-01-28 2 views
1

비슷한 스레드를 살펴 보았는데 모두 C++과 관련이 있으므로 그냥 물어 보는 것보다는 물어 보는 것이 더 낫다고 생각합니다.기본 클래스 배열에서 파생 클래스 필드에 액세스하는 방법?

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

foo이 더 변수/방법과 사용자 정의 클래스라고 말할 : 나는 예를 들어,이 코드가

public class foo 
{ 

} 

가 그 barfoo에서 파생 된 사용자 정의 클래스입니다 :

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

fooArray에 의 변수 fooBar에 액세스해야합니다. 이지만 변수가 기본 클래스에 나타나지 않으므로 foo의 배열에는 나타나지 않습니다. 내가 접근 할 수있는 방법이 있습니까?

편집 : 응용 프로그램 코드에서 foo와 bar는 필요한 생성자 및 기타 설정을 갖습니다.

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

주 : foo 클래스 fooBar이없는

+0

수 없습니다. 그러나 필드를 기본 클래스 상태로 승격시킬 수 있습니다. –

+2

디자인을 수정해야한다고 생각합니다. 수십 가지의 파생 클래스가 있다면 각각 자체 속성이 있습니다 ... –

답변

0

,

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

또는 유형 bar으로 객체를 처리하도록 as 연산자를 사용하여,

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

그러나 예제에서 정의한대로 fooBarprivate입니다. 수업 외부에서 액세스하려면 public해야합니다.

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

도움 주셔서 감사합니다! 귀하의 솔루션은 완벽하게 작동했습니다. 또한 fooBar는 내 응용 프로그램 코드에 공개되었으므로 입력하는 것을 잊어 버렸습니다. :) – ApachePilotMPE

0

때문에 당신이 Bar에 변수를 캐스팅하지 않는 field.You는 액세스 할 수 없습니다 fooBar 필드가 있어야한다 공공 .Fields이 개인 기본적으로.

당신은 bar에 액세스와 같은 그런 식으로 배열의 항목 중 하나를 주조 할 수
+1

이렇게해야하는 경우 디자인에 ** 매우 매우 매우 ** 잘못된 점이 있습니다. –

+0

나는 그것을 얻지 못한다. Simon : D 좀 더 명확히 해 주시겠습니까? 이 경우에 그는 그것을 캐스팅해야하지만, 인터 카페를 사용하는 것은 좋을 것이다. –

+0

@SimonWhitehead 귀하의 의견은 실제로 OP 자체에 속해 있습니다. – rae1

0

가 액세스하기 위해 당신은 bar 인스턴스에 fooArray[2] 실제로 bar의 인스턴스가 아닌 경우이 코드가 예외를 던질 것

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

참고 값을 캐스팅해야합니다. 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 
} 
관련 문제