Oto fragment kodu z książki:
class Game {
privste player Player;
public Rectangle Boundaries {get; private set;}
public Game(Rectangle boundaries) {
this.boundaries = boundaries;
}
public void Move(Direction direction) {
player.Move(direction);
}
}
class Mover {
protected Point location;
public Point Location {get { return location; } }
protected Game game;
public Mover(Game game, Point startingLocation) {
this.game = game;
this.location = startingLocation;
}
public Point Move(Direction direction, Rectangle boundaries) {
Point newLocation = location;
switch (direction) {
case Direction.Up:
if (newLocation.Y - MoveInterval >= boundaries.Top)
newLocation.Y -= MoveInterval;
break;
//to samo dla reszty kierunków świata
}
return newLocation;
}
}
class Player : Mover {
public void Move(Direction direction) {
base.location = Move(direction, game.Boundaries);
}
}
Zastanawiam się po co w sygnaturze metody Move
w klasie Mover
podajemy w parametrze Rectangle boundaries
. Chodzi o to, że przecież Mover
posiada referencję do Game
, więc jaki jest w tym sens? Usunąłem więc ten parametr z sygnatury, jednak napotkałem błąd. Teraz Player
oraz Mover
posiadają takie same parametry metody Move
, więc metoda z klasy Player
jest ukryta. Nie mogę natomiast przesłonić metody, ponieważ jedna metoda zwraca Point
a druga jest void
. Co w takim przypadku powinienem zrobić? Czy wersja książkowa jest poprawna?
Druga sprawa, czy w linijce Point newLocation = location;
nie powinno być czasem Point newLocation = Location;
, czy nie ma to większego znaczenia? Chodzi mi o to, że do odczytywania powinniśmy chyba użyć publicznej właściwości, a nie prywatnego pola. Gdybym trochę rozbudował tą właściwość i dodał tam jakąś metodę, to musiałbym w tym miejscu zmienić z prywatnego pola na publiczną właściwość.