繁体   English   中英

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

[英]How to get a property value from a nested class?

您好,我在获取嵌套的 class 属性值时遇到问题。 我想

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); 在主 class。 有可能获得engineNumber值吗?

您通常不想像以前那样嵌套 class 定义。 如果你有一辆可以使用不同类型发动机的汽车呢? 比如说,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;

在此示例中,您可以通过引用 object 属性 ( get ) 来获取所需的数据,但您将无法以相同的方式更改该数据 ( private set )。 相反,您需要创建 object 方法(如果您是 OOP 新手,请阅读:函数)来显式更改这些值。

是的,你将能够。

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

class Engine是私有的,它应该是公共的。

并且它的构造函数应该是internal protected的,只允许一个Car创建它的Engineinternal是为了防止其他程序集能够创建一个,并且protected它允许派生类甚至在另一个程序集中创建它。

您可以通过根据需要更改 getter/setter 来尝试类似的操作(我将它们设为 public/private,因此在创建后它们不能被外部实体修改):

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

}

如果你希望引擎坏了也能换,那么 class 可能没有嵌套。

实现它的方法有很多,这里是我的:),诀窍是将 class 声明与 class 实现区分开来。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM