Как получить значение свойства из вложенного класса? - PullRequest
0 голосов
/ 10 октября 2019

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

class Car
{

  string name;
  string model;

  class Engine
  {
    public string engineNumber;

    public Engine(string engineNumber)
    {
      this.engineNumber = engineNumber;
    }

  }

  public Car(string name, string model, string engineNumber)
  {

    this.name = name;
    this.model = model;
    Engine e1 = new engine(engineNumber)
  }

}

В этом коде я пытаюсь написать Console.Write(c1.e1.engineNumber); в главном классе. Можно получить engineNumber значение?

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Как правило, вы не хотите вкладывать определения классов так, как вы это делали. Что если бы у вас была машина, которая могла бы использовать другой тип двигателя? Как, скажем, 4-литровый против 2-литровый? Или нормально надутый против турбо заряженного? Вместо этого вам может потребоваться передать Engine в качестве параметра Car.

. Что касается вашей реальной проблемы получения значений из этих объектов, вам также необходимо определить, как можно получить значенияи / или изменилось. Конструктор выполняет первоначальную работу, но что, если Engine или Car имеют значения, которые необходимо изменить или получить во время жизни программы? Вам нужны средства доступа.

public class Car
{
    public string name { get; private set; }
    public string model { get; private set; }
    public Engine engine { get; private set; }

    public Car(string name, string model, Engine engine)
    {
        this.name = name;
        this.model = model;
        this.engine = engine;
    }
}

class Engine
{
    public string number { get; private set; }
    // other values as necessary

    public Engine(string number)
    {
        this.number = number;
    }
}

var newCar = new Car('Volvo', 'Hatchback', new Engine('someNumber'));
var engineNumber = newCar.engine.number;

В этом примере вы можете получить нужные данные, ссылаясь на свойство объекта (get), но вы не сможете изменить эти данные таким же образом. (private set). Вместо этого вам нужно создать объектные методы (читай: функции, если вы новичок в ООП), чтобы явно изменить эти значения.

0 голосов
/ 10 октября 2019

Множество способов сделать это, вот мое :), хитрость заключается в том, чтобы отличить объявление класса от реализации класса.

0 голосов
/ 10 октября 2019

Да, вы сможете.

Но код, который вы предоставляете, теряет Engine e1 сразу после создания, поскольку вы не сохраняете его на уровне класса Car.

И класс Engine является закрытым, он должен быть общедоступным.

И его конструктор должен быть internal protected, чтобы только Car мог создать его Engine: internal чтобы другая сборка не могла его создать, и protected, чтобы позволить производным классам даже в другой сборке создавать ее.

Вы можете попробовать что-то подобное, изменив методы получения / установки по своему усмотрению (Я сделал их общедоступными / закрытыми, поэтому после создания они не могут быть модифицированы внешними объектами):

static void Main(string[] args)
{
  Car c1 = new Car("Toyota", "Model", "1");
  Console.WriteLine(c1.engine.engineNumber);
}

public class Car
{

  public class Engine
  {
    public string engineNumber { get; private set; }
    internal protected Engine(string engineNumber)
    {
      this.engineNumber = engineNumber;
    }
  }

  public string name { get; private set; }
  public string model { get; private set; }
  public Engine engine { get; private set; }

  public Car(string name, string model, string engineNumber)
  {
    this.name = name;
    this.model = model;
    this.engine = new Engine(engineNumber);
  }

}

Если вы хотите изменить двигатель, если он сломан, класс может бытьне вложенный.

...