[英]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
。
关于从这些对象获取值的实际问题,您还需要定义如何获取和/或更改值。 构造函数完成最初的工作,但是如果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;
在此示例中,您可以通过引用 object 属性 ( get
) 来获取所需的数据,但您将无法以相同的方式更改该数据 ( private set
)。 相反,您需要创建 object 方法(如果您是 OOP 新手,请阅读:函数)来显式更改这些值。
是的,你将能够。
但是您提供的代码在创建后就丢失了Engine e1
,因为您没有将它存储在Car
class 级别。
class Engine
是私有的,它应该是公共的。
并且它的构造函数应该是internal protected
的,只允许一个Car
创建它的Engine
: internal
是为了防止其他程序集能够创建一个,并且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.