2014-09-05 45 views
0

我覺得我應該只需要有一個實例變量引用一個對象。但在下面的代碼中,我有兩個實例變量「_character」和「_witch」引用同一個對象。如果我添加一個更專業的女巫班,我不得不添加第三個實例變量。
這是典型的人們在這種情況下做什麼?或者有沒有一種方法只用一個參考來實現呢?另外,我真的不想投入任何東西(除非在這種情況下確實是最好的做法)。如何在沒有引用同一個對象的多個實例變量的情況下實現繼承?

在擴展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 – 2014-09-05 20:47:01

+1

@JustinPihony我想象他想訪問'WhichState'的成員,這在'CharacterState'中沒有定義,並且他不想在每次調用時都進行轉換。 – 2014-09-05 20:49:28

+0

@NathanA是的。 – Kacy 2014-09-05 20:53:11

回答

8

如果您不需要特定的巫通話,你可以溝_witch場。使用_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... */ 
    } 
} 

然後:

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

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

     _character.SomeMethodOnWitchState(); 
    } 
} 

_character.SomeMethodOnWitchState()通話將內WitchAnimationController因爲_character是有效WitchState類型是有效的。

+0

我甚至沒有考慮泛型。這完全解決了這個問題。非常感謝。 – Kacy 2014-09-05 20:53:44

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其他重要成員我會去我的做法。

+0

我不喜歡這件事的唯一情況是我必須保持對控制器和狀態的參考。感謝您的有效替代,但。 Upvoted。 – Kacy 2014-09-05 20:58:14

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

喬恩Skeet擊敗你這個答案,但我仍然會給你一個upvote! – Kacy 2014-09-05 20:54:39

相關問題