C # наследование не работает должным образом - PullRequest
0 голосов
/ 05 марта 2012

Я работаю над изучением C # и столкнулся с проблемой с примером из моей книги. Я не могу понять, почему он устанавливает для моих объектов «Выход» соответствующие локации, но для моего RoomWithDoor.Exits значение «ноль».

    public Form1()
            {
                InitializeComponent();
                CreateObjects();
                MoveToANewLocation(livingRoom);
            }
            public void CreateObjects()
            {
                livingRoom = new RoomWithDoor("living room", "an antique carpet", "an oak door with a brass knob");
                livingRoom.Exits = new Locations[] { diningRoom, kitchen };
                livingRoom.DoorLocation = frontYard;

                diningRoom = new Room("dining room", "crystal chandelier");
                diningRoom.Exits = new Locations[] { livingRoom, kitchen };

    abstract class Locations
    {
        public Locations(string name)
        {
            this.name = name;
        }
        public Locations[] Exits;
        private string name;
        public string Name { get { return name; } }

class Room : Locations
{
    public Room(string name, string decoration)
        : base(name)
    {
        this.decoration = decoration;
    }
class RoomWithDoor : Room, IHasExteriorDoor
{
    public RoomWithDoor(string name, string decoration, string doorDescription)
        : base(name, decoration)
    {
        this.doorDescription = doorDescription;
    } 

Итак, это работает

private void MoveToANewLocation(Locations newLocation)
        {
    currentLocation = newLocation;
            currentLocationExit = currentLocation.Exits[0];
            MessageBox.Show(diningRoom.Name);

но эта доза не

    MessageBox.Show(livingRoom.Exits[0].Name);

Ответы [ 2 ]

4 голосов
/ 05 марта 2012
livingRoom = new RoomWithDoor("living room", "an antique carpet", "an oak door with a brass knob");
livingRoom.Exits = new Locations[] { diningRoom, kitchen };
livingRoom.DoorLocation = frontYard;

diningRoom = new Room("dining room", "crystal chandelier");
diningRoom.Exits = new Locations[] { livingRoom, kitchen };

Это не работает, как вы ожидаете. Поскольку вы назначаете новое значение для diningRoom после назначения livingRoom.Exits, livingRoom.Exits будет по-прежнему иметь значение, которое diningRoom имело на момент назначения, что, вероятно, null.

1 голос
/ 05 марта 2012

вы добавляете столовую к выходу из гостиной, прежде чем инициализировать столовую ...

Создайте и столовую, и гостиную, затем установите выходы, используя созданные вами объекты, в противном случае они будут равны нулю, так как вы установите выход как ссылку на нулевой объект, а затем установите ссылку на столовую как новый объект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...