2014-09-05 2 views
0

하나의 인스턴스 변수 만 객체를 참조해야한다고 생각합니다. 그러나 아래 코드에서 같은 개체를 참조하는 "_character"및 "_witch"인스턴스 변수가 2 개 있습니다. 좀 더 특수한 마녀 클래스를 추가하면 세 번째 인스턴스 변수를 추가해야합니다.
이것은 일반적으로 사람들이이 상황에서 수행하는 것입니까? 아니면 단 하나의 참조를 사용하여 이것을 달성 할 수있는 방법이 있습니까? 또한, 정말로 (이 시나리오에서 실제로 가장 좋은 방법이 아닌 한) 어떤 것도 캐스팅하지 않으려합니다.같은 개체를 참조하는 여러 인스턴스 변수없이 상속을 구현하는 방법은 무엇입니까?

AnimationController를 확장하는 WitchAnimationController 위에 WitchState가 CharacterState를 확장합니다.

기본 클래스 :

public class AnimationController 
{ 
    protected CharacterState _character; 

    public AnimationController(CharacterState character) 
    { 
     _character = character; 
    } 

    public void UpdateAnimations() 
    { 
     /* call on some CharacterState functions... */ 
    } 
} 

아이 클래스 :

public class WitchAnimationController : AnimationController 
{ 
    protected WitchState _witch; //inherits from CharacterState 

    public AnimationController(WitchState witch) : base(witch) 
    { 
     _witch = witch; 
    } 

    public void UpdateAnimations() 
    { 
     base.UpdateAnimations(); 

     /* call on some WitchState functions... */ 
    } 
} 
+1

? 그것은 이미 _character에 저장되어 있습니다. –

+1

@JustinPihony 저는'CharacterState'에 정의되지 않은'WhichState'의 멤버에 액세스하려고하고 있으며 모든 호출에 대해 캐스트를하고 싶지 않다고 생각합니다. –

+0

@ NathanA 네, 맞습니다. – Kacy

답변

8

. 내 방식으로 갈 것입니다 자세한 내용은없이, 똑같이 유효 . _character 필드를 사용 - 개인적으로 보호 된 속성 그것을 개인 필드를 만들어 주겠다고하지만

당신이 문자 특정 구성원을해야하는 경우에는 애니메이션 컨트롤러는 일반적인하게 고려해야합니다

public class AnimationController<T> where T : CharacterState 
{ 
    protected T _character; 

    public AnimationController(T character) 
    { 
     _character = character; 
    } 

    public void UpdateAnimations() 
    { 
     /* call on some CharacterState functions... */ 
    } 
} 
그런 다음 6,

:

public class WitchAnimationController : AnimationController<WitchState> 
{  
    public WitchAnimationController(WitchState witch) : base(witch) 
    {} 

    public void UpdateAnimations() 
    { 
     base.UpdateAnimations(); 

     _character.SomeMethodOnWitchState(); 
    } 
} 

_character.SomeMethodOnWitchState() 전화 효과적으로 유형 WitchState의입니다 WitchAnimationController_character 때문에 내에서 유효합니다.

+0

나는 제네릭조차 고려하지 않았다. 이것은 완전히 문제를 해결합니다. 고마워. – Kacy

2

당신은 무엇을 가지고하는 것은 끔찍한 아니라, 대신에이 디자인을 고려

public class AnimationController 
{ 
    public AnimationController() 
    { 
    } 

    public void UpdateAnimations(CharacterState character) 
    { 
     /* call on some CharacterState functions... */ 
    } 
} 

public class WitchAnimationController : AnimationController 
{ 
    public AnimationController() 
    { 
    } 

    public void UpdateAnimations(WitchState witch) 
    { 
     base.UpdateAnimations(witch); 

     /* call on some WitchState functions... */ 
    } 
} 

당신 은 모든 참조를 유지하지만 컨트롤러가 실제로 함수를 호출하면, 다른 하나는 다른 상태 객체를 유지하게 할 수 있습니다.

하나의 접근 방식은 (AnimationController의 다른 중요한 일원처럼 당신이 마녀 특정 호출이 필요하지 않으면 당신은 단지 _witch 필드 도랑 수

+0

내가 이것에 대해 싫어하는 유일한 점은 컨트롤러와 주 모두에 대한 참조를 유지해야한다는 것입니다. 그래도 유효한 대안을 가져 주셔서 감사합니다. Upvoted. – Kacy

2

사용 generics :

public class AnimationController<T> where T : CharacterState 
{ 
    protected T _character; 

    public AnimationController(CharacterState character) 
    { 
     _character = character; 
    } 
} 

그런 다음 각 조상에 _character는 다음과 같이, 각각의 상속 형식이 될 것입니다 : 당신은 왜 모든 마녀를 저장하는

public class WitchAnimationController : AnimationController<WitchState> 
{   
    public AnimationController(WitchState witch) : base(witch) 
    { 
    } 
} 
+0

Jon Skeet이 당신을이 해답으로 이긴다. 그러나 나는 여전히 너에게 upvote를 줄 것이다! – Kacy

관련 문제