你好,我在获取嵌套类属性值时遇到问题。我要
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 class中编写Console.Write(c1.e1.engineNumber);
。可以获取engineNumber
的值吗?
答案 0 :(得分:1)
通常,您不想像以前那样嵌套类定义。如果您有一辆可以使用其他发动机的汽车怎么办?比如说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
)更改该数据。相反,您需要创建对象方法(如果是OOP的新手,则可以使用read方法:函数)来显式更改这些值。
答案 1 :(得分:0)
是的,您将能够。
但是您提供的代码在创建后就丢失了Engine e1
,因为您没有将其存储在Car
类级别。
并且类Engine
是私有的,它应该是公共的。
其构造函数应为internal protected
,以仅允许Car
创建其Engine
:internal
以防止其他程序集创建一个,而{{ 1}},甚至在另一个程序集中也可以允许派生类创建它。
您可以尝试通过更改所需的getter / setter来尝试类似的操作(我将它们设置为public / private,因此创建后便无法被外部实体修饰)
protected
如果您希望在引擎损坏时能够对其进行更改,则该类可能不会嵌套。
答案 2 :(得分: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