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

C# 如何从嵌套类中获取属性值?,c#,oop,inner-classes,encapsulation,abstraction,C#,Oop,Inner Classes,Encapsulation,Abstraction,您好,我在获取嵌套类属性值时遇到问题。我想要 class Car { string name; string model; class Engine { public string engineNumber; public Engine(string engineNumber) { this.engineNumber = engineNumber; } } public Car(string name, string

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

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.enginember)在主类中。可以获取
engineNumber
值吗?

是的,您将能够

但是您提供的代码在创建后立即丢失
引擎e1
,因为您没有将其存储在
汽车
类级别

而类
引擎
是私有的,应该是公共的

它的构造函数应该是
内部保护的
,以便只允许
汽车
创建它的
引擎
内部
以防止其他程序集能够创建引擎,并且
受保护的
允许派生类甚至在另一个程序集中创建引擎

您可以根据需要更改getter/setter(我将它们设置为public/private,这样在创建之后外部实体就不能对它们进行mofication)来尝试类似的操作:


如果您希望在引擎损坏时能够更改引擎,那么类可能不会嵌套。

实现它的方法很多,下面是我的:),诀窍是区分类声明和类实现

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

您可以在这里看到它的运行:

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

关于从这些对象获取值的实际问题,还需要定义如何获取和/或更改值。构造器进行初始工作,但是如果
引擎
汽车
的值需要在程序的生活方式中更改或获取,该怎么办?你需要访问者

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新手)来显式更改这些值。

什么是
c1
?您的代码示例不完整。此外,您可能应该使用属性而不是字段。您为什么在私有内部类中定义了
Engine
?此外,您也不会对在
汽车
构造函数中创建的
引擎
执行任何操作。我建议将
Engine
移出
Car
,并将
Engine
属性添加到
Car
。可能应该指出,在类中包含类通常不是正确的方法,特别是在这种情况下,似乎没有理由这样做。这可能取决于
引擎是否是更大策略的一部分。。。
发动机是否真的是一个基于气缸、吸气、排量、马力等因素的接口。?
引擎
(或
IEngine
)工作原理的基本逻辑是否重要?将类放在它们自己的文件中通常是构造事物的首选方式。您正在做一个很大的假设,
引擎
类永远不会被
汽车
以外的任何东西所需要(也许OP也是如此)。这就是为什么这似乎是一个很好的学习机会,我问的问题不是关于一个具体的问题。我刚刚开始学习编程,我想到了​​是否可以这样做,但在文档中我无法回答问题谢谢,这正是我的意思:)
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;