2016-05-30 6 views
0

Ich habe eine nicht abstrakte Klasse namens "Player" und eine abstrakte Klasse namens "Score" mit einer Unterklasse von "Kombination". Innerhalb der Kombination gibt es eine abstrakte Methode, die in weiteren Unterklassen verwendet wird.Wie abstrakte Klasse von nicht übergeordnete aufrufen

Wie kann ich meine abstrakte Methode von der nicht übergeordneten Methode 'Player' aufrufen, ohne sie statisch zu machen?

// This is the abstract method within Combination, 
// it uses the face values from rolled dice to calculate the score. 

abstract public int CalculateScore(int[] faceValues); 

//Array of 'Score's in Player 

private Score[] scores = new Score[10]; 
+0

Können Sie bitte mehr Informationen über den Player und den Kombinationsunterricht geben? Was bedeutet faceValues? – Silvinus

Antwort

0

Sie können nicht. Dies ist ein Zugriffsmodifikator, der den Zugriff auf eine Klasse einschränken soll. Um es in Ihrem Fall zu verwenden, schlage ich vor, die Zugänglichkeit von abstract zu public einer Score Klasse zu ändern.

0

Wenn ich Sie richtig verstehe, möchten Sie CalculateScore in Ihrer abgeleiteten Klasse implementieren, indem Sie auf das Feld scores zugreifen?

Einfache Antwort ist, können Sie nicht, wie Sie es so entworfen haben. private Modifizierer stellt sicher, dass nur Ihre eigene Klasse auf das Feld zugreifen kann. Wenn Sie möchten, dass abgeleitete Klassen Zugriff auf dieses Feld haben, müssen Sie Ihren Modifikator in protected im Feld scores ändern.

Wenn Sie nicht Ihre abgeleiteten Klassen wollen Zugang zu scores direkt haben, müssen Sie mit mindestens protected Zugriffsmethoden implementieren, das Ändern des scores -field in definierter Weise auf der Basisklasse.

0

So Ihre Situation:

  • Player ist ein normaler classs
  • Score ist eine abstrakte Klasse
  • Combination ist eine abstrakte Klasse zu, die Score Unterklassen. Es enthält eine abstrakte Methode CalculateScore, die Sie aus der Klasse Player aufrufen möchten.
  • Player hat eine Reihe von Score s

Sie können prüfen, ob ein Element in Ihren Score Array vom Typ ist Combination dann gegossen.

if(score[0] is Combination) 
{ 
    (score[0] as Combination).CalculateScore(/* arguments here */); 
} 

Sie müssen möglicherweise überdenken, wie Ihre Klassen funktionieren. IMHO, Spieler sollte nicht derjenige sein, der die Punkte berechnet. Vielleicht verwenden Sie eine , um damit umzugehen.

Verwandte Themen