如何从嵌套类中获取属性值?

问题描述 投票:0回答:3

你好,我有获取嵌套类属性值的问题。我想要

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)
  }

}

在这段代码中,我尝试在Main类中编写Console.Write(c1.e1.engineNumber);。是否可以获取engineNumber值?

c# oop inner-classes encapsulation abstraction
3个回答
0
投票

完成它的许多方法,这是我的:),诀窍是区分类声明和类实现。

using System;

public class Program
{
  public static void Main()
  {
    var c = new Car("Name", "Model", "Engine");
    Console.WriteLine(c.engine.engineNumber);
  }

  class Car
  {
    string name;
    string model;
    public Engine engine;

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

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

您可以看到它在这里运行:https://dotnetfiddle.net/66lGn6


0
投票

您通常不想像以前那样嵌套类定义。如果您有一辆可以使用其他发动机的汽车怎么办?比如说4升对2升?还是正常吸气与涡轮增压?您可能想要做的是将Engine作为参数传递给Car

关于从这些对象获取值的实际问题,还需要定义如何获取和/或更改值。构造函数可以完成初始工作,但是如果EngineCar的值在程序的生活方式期间需要更改或获取,该怎么办?您需要访问器。

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)更改该数据。相反,您需要创建对象方法(如果您不熟悉OOP,请阅读:函数)以显式更改这些值。


0
投票

是,您将可以。

嵌套类是正确的,因为引擎取决于汽车。

但是您提供的代码在创建后立即丢失了Engine e1,因为您没有将其存储在Car类级别。

并且类Engine是私有的,应该是公共的。

并且其构造函数应为internal,以仅允许Car从其他程序集中创建其Engine

您可以通过随意更改获取器/设置器来尝试类似的操作(我将它们设置为公共/私有,因此创建后就不能被外部实体修饰)]

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 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);
  }

}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.