如何从嵌套的 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)
}
}
在这段代码中,我尝试在 Main class 中编写 Console.Write(c1.e1.engineNumber);
。有可能得到 engineNumber
值?
是的,你会的。
但是您提供的代码在创建后就丢失了 Engine e1
,因为您没有将它存储在 Car
class 级别。
而classEngine
是私有的,应该是public.
它的构造函数应该是 internal protected
只允许一个 Car
创建它的 Engine
: internal
以防止其他程序集能够创建一个,并且protected
允许派生 classes 甚至在另一个程序集中创建它。
您可以根据需要更改 getters/setters 来尝试类似的操作(我制作了它们 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
您通常不希望像您那样嵌套 class 定义。如果你有一辆可以使用不同类型发动机的汽车怎么办?比如说,4 升和 2 升?还是正常吸气与涡轮增压?您可能想要做的是将 Engine
作为参数传递给 Car
.
关于您从这些对象中获取值的实际问题,您还需要定义如何获取值and/or更改。构造函数执行初始工作,但如果 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 的新手)来显式更改这些值。
您好,我在获取嵌套 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)
}
}
在这段代码中,我尝试在 Main class 中编写 Console.Write(c1.e1.engineNumber);
。有可能得到 engineNumber
值?
是的,你会的。
但是您提供的代码在创建后就丢失了 Engine e1
,因为您没有将它存储在 Car
class 级别。
而classEngine
是私有的,应该是public.
它的构造函数应该是 internal protected
只允许一个 Car
创建它的 Engine
: internal
以防止其他程序集能够创建一个,并且protected
允许派生 classes 甚至在另一个程序集中创建它。
您可以根据需要更改 getters/setters 来尝试类似的操作(我制作了它们 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
您通常不希望像您那样嵌套 class 定义。如果你有一辆可以使用不同类型发动机的汽车怎么办?比如说,4 升和 2 升?还是正常吸气与涡轮增压?您可能想要做的是将 Engine
作为参数传递给 Car
.
关于您从这些对象中获取值的实际问题,您还需要定义如何获取值and/or更改。构造函数执行初始工作,但如果 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 的新手)来显式更改这些值。