2011-09-28 2 views
0

C#에서는 기본 클래스와 파생 클래스가 있습니다. 기본 클래스 형태로 매개 변수로 전달 된 파생 클래스 인스턴스의 속성에 액세스하는 방법

난이 기본 클래스로 전달 된 경우에도, 입력 파라미터

public void SomeFunction(BaseClass InstanceOfDerivedClass) 

I 파생 클래스 고유의 특성에 접근 할 수있는 방법이 있으므로 기본 클래스를 갖는 기능이? GetType이나 Cast 또는 이와 비슷한 것을 사용할 수 있습니까?

솔루션이 우아하지 않을 수도 있지만 현재로서는 다른 파생 클래스에 대해이 기능을 여러 번 반복하는 것이 좋습니다.

이 (나쁜 방법)을 할 수

답변

1

:

public void SomeFunction(BaseClass instanceOfDerivedClass) 
{ 
    DerivedClass derived = null; 

    if(instanceOfDerivedClass is DerivedClass) 
    { 
     derived = instanceOfDerivedClass as DerivedClass; 
     // Do stuff like : 
     int prop = derived.DerivedProperty; 
    } 
} 

또는, 에릭 (좋은 방법)에 의해 제안 :

public void SomeFunction(BaseClass instanceOfDerivedClass) 
{ 
    DerivedClass derived = instanceOfDerivedClass as DerivedClass; 

    if(derived != null) 
    { 
     // Do stuff like : 
     int prop = derived.DerivedProperty; 
    } 
} 
+7

올바른 생각. 매우 말의 구현. 간단하게'DerivedClass derived = instanceOfDerivedClass as DerivedClass; if (derived! = null) ... ' –

+0

끔찍한 캐스트 연습 ... –

+0

@ 에릭 : 고맙습니다. 고마워요. –

4

주조에서 참조하기 때문에, 트릭을 확실히해야한다 힙은 그 클래스에있다. 아마도 다음과 같은 것일 수 있습니다 :

if (InstanceOfDerivedClass is DerivedClass) 

그리고이 블록에 캐스팅하고 상호 작용할 수 있습니다.

그러나 더 큰 문제는 왜 필요합니까? 인수로 받아 들여지고있는 형태가 올바른 형태가 아닌 경우,이 메소드가 잘못된 추상화를 사용하고있는 것처럼 들립니다. 이것은 Liskov Substitution을 깨고 디자인을 리팩터링하는 주요 후보자처럼 보입니다. (그 중 우리는 많이 도울만큼 충분하지 않습니다.)

+0

+1 잘못된 추상화 및 LSP를 지적합니다. –

+0

캐스팅 방법을 약간 확장 할 수 있습니까? 멍청한 녀석 인 것에 대해 유감스럽게 생각합니다. – Caustix

+0

@Caustix : 문제 없습니다. 가장 직관적이고 우아한 방법은 변수를 다른 유형으로 해석하기 위해 "as"키워드를 사용하여 Amaud가 지적한 것일 것입니다. "InstanceOfDerivedClass as DerivedClass"변수가 대문자로 시작한다는 것은 코드에서 주목할 가치가 있습니다 (StackOverflow의 코드 인터프리터가 대신 형식을 나타내는 이유입니다). 엄격하게 관용적 인 C#이 아닙니다. 소문자로 시작하는 것이 더 표준 적입니다. 그리고 전과 같이이 유형의 주조가 이상적인 솔루션이 아니라는 점을 충분히 강조 할 수 없습니다. 작동하지만 해결 방법입니다. – David

관련 문제