c # - Вложенные классы?Недвижимость со свойствами? - PullRequest
2 голосов
/ 23 декабря 2011

Я хотел бы создать класс со свойствами, которые имеют подвойства ...

Другими словами, если бы я сделал что-то вроде:

Fruit apple = new Fruit();

Я бы хотел что-то вроде:

apple.eat(); //eats apple
MessageBox.Show(apple.color); //message box showing "red"
MessageBox.Show(apple.physicalProperties.height.ToString()); // message box saying 3

Я бы подумал, что это будет сделано так:

class Fruit{
    public void eat(){
        MessageBox.Show("Fruit eaten");
    }
    public string color = "red";
    public class physicalProperties{
        public int height = 3;
    }

}

... но, если бы это работало, меня бы здесь не было ...

Ответы [ 6 ]

3 голосов
/ 23 декабря 2011

Так близко!Вот как должен выглядеть ваш код:

class Fruit{
    public void eat(){
        MessageBox.Show("Fruit eaten");
    }
    public string color = "red";
    public class PhysicalProperties{
        public int height = 3;
    }
    // Add a field to hold the physicalProperties:
    public PhysicalProperties physicalProperties = new PhysicalProperties();
}

Класс просто определяет сигнатуру, но вложенные классы не становятся автоматически свойствами.

В качестве примечания, я также рекомендую пару советов следовать "лучшим практикам" .NET:

  • Не вкладывайте классы, если это не необходимо
  • Все открытые члены должны быть свойствами, а не полями
  • Все открытые члены должны быть PascalCase, а не camelCase.

Я уверен, что также есть много документации по передовым методамты так склонен.

2 голосов
/ 23 декабря 2011
class Fruit{
    public void eat(){
        MessageBox.Show("Fruit eaten");
    }
    public string color = "red";
    //you have declared the class but you havent used this class
    public class physicalProperties{
        public int height = 3;

    }
    //create a property here of type PhysicalProperties
    public physicalProperties physical;
}
0 голосов
/ 23 декабря 2011
class Fruit{
    public void eat(){
        MessageBox.Show("Fruit eaten");
    }
    public string color = "red";
    public class physicalProperties{
        public int height = 3;
    }
    // create a new instance of the class so its public members
    // can be accessed
    public physicalProperties PhysicalProperties = new physicalProperties();
}

Затем вы можете получить доступ к под-свойствам следующим образом:

Fruit apple = new Fruit();
MessageBox.Show(apple.PhysicalProperties.height.ToString());
0 голосов
/ 23 декабря 2011

Вам нужно будет предоставить свойство, как оно содержится, для экземпляра класса physicalProperties, так что, возможно, вы могли бы сделать как

public Fruit()
{
    physical = new physicalProperties();
}

И свойство, которое возвращает его

public int Height { get { return physical.height;}}

ИЛИ

public physicalProperties physical;

так что вы можете сделать apple.physical.height

0 голосов
/ 23 декабря 2011
class Fruit{
    public class physicalProperties{
        public int height = 3;
    }
}

Fruit.physicalProperties действительно объявляет другой тип, но:

  1. Он будет закрытым, доступен только членам Fruit, если вы не объявите его public.
  2. Создание типа не создает экземпляр этого типа или члена Fruit, чтобы позволить пользователям Fruit получить к нему доступ.

Вам необходимо добавить:

class Fruit {
  private physicalProperties props;
  public physicalProperties PhysicalProperties { get; private set; }

и в конструкторе (по умолчанию) Fruit назначить PhysicalProperties экземпляр physicalProperties.

0 голосов
/ 23 декабря 2011

Можете ли вы экстраполировать класс, а затем сослаться на него?

class Fruit{
    public void eat(){
        MessageBox.Show("Fruit eaten");
    }
    public string color = "red";
    public physicalProperties{
        height = 3;
    }

}

public class physicalProperties{
        public int height = 3;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...