在继承中使用 this() 和 base()
Using this() and base() in inheritance
所以我在 c# 中创建了一个库存系统,其中每个项目都是 class 继承自其他 classes。目前我正在进行一些测试 classes,其中之一是 Fish。
Fish继承自Consumables继承自Items(顶级class)
注意:消耗品基本上是stack-able项。
我想在 Consumables class 中创建 2 个默认构造函数,其中一个不带参数:
public Consumable() : base() {
quantity = 1;
}
只需将数量设置为 1。
一个接受一个参数,数量:
public Consumable(int Quantity) : this() {
if (quantity <= maxStack)
quantity = Quantity;
else
quantity = maxStack;
}
创建时设置数量。现在我认为在上面的代码中使用 this() 会强制 child 使用它自己的默认无参数构造函数作为 this,但事实似乎并非如此。这就是我的鱼:
public Fish() : base() {
name = "fish";
ID = 1;
variant = 0;
maxStack = 20;
desc = "A Fish of some kind";
rarity = ItemRarity.Common;
}
public Fish(int QTY) : base(QTY) { }
我想要发生的是当调用 Fish(int QTY) 时,我希望它调用 Fish() 来设置基础知识,然后调用 Consumable(QTY) 来设置数量。
但是目前,当调用 Fish(int QTY) 时,它会调用 Consumable(QTY),后者调用 Consumable() 而不是 Fish()
有什么方法可以使它按照我正在寻找的方式工作吗?
编辑:正如一些评论中已经建议的那样,这里有一个可能的解决方案,其中包含从两个构造函数调用的 init-method 。 Fish(qty) 现在调用基础构造函数和自己的 Init-method(与 Fish() 相同)。
public Fish() : base() {
Init();
}
public Fish(int QTY) : base(QTY){
Init();
}
private void Init(){
name = "fish";
ID = 1;
variant = 0;
maxStack = 20;
desc = "A Fish of some kind";
rarity = ItemRarity.Common;
}
CLR 首先创建 Baseclass 实例而不是 Childclass。并且没有办法影响它。在您的情况下,我建议创建方法 Initialize。 .net fiddle example
消耗品class
public void Initialize(){
Console.WriteLine("Consumable.Initialize()");
quantity = 1;
}
public void Initialize(int Quantity){
Console.WriteLine("Consumable.Initialize(QTY)");
if (quantity <= maxStack)
quantity = Quantity;
else
quantity = maxStack;
}
和鱼
public Fish(int QTY){
Initialize(QTY);
}
public void Initialize(){
Console.WriteLine("Fish.Initialize()");
name = "fish";
ID = 1;
variant = 0;
maxStack = 20;
}
public void Initialize(int QTY) {
Console.WriteLine("Fish.Initialize(QTY)");
Initialize();
base.Initialize(QTY);
}
输出:
所以我在 c# 中创建了一个库存系统,其中每个项目都是 class 继承自其他 classes。目前我正在进行一些测试 classes,其中之一是 Fish。 Fish继承自Consumables继承自Items(顶级class) 注意:消耗品基本上是stack-able项。
我想在 Consumables class 中创建 2 个默认构造函数,其中一个不带参数:
public Consumable() : base() {
quantity = 1;
}
只需将数量设置为 1。
一个接受一个参数,数量:
public Consumable(int Quantity) : this() {
if (quantity <= maxStack)
quantity = Quantity;
else
quantity = maxStack;
}
创建时设置数量。现在我认为在上面的代码中使用 this() 会强制 child 使用它自己的默认无参数构造函数作为 this,但事实似乎并非如此。这就是我的鱼:
public Fish() : base() {
name = "fish";
ID = 1;
variant = 0;
maxStack = 20;
desc = "A Fish of some kind";
rarity = ItemRarity.Common;
}
public Fish(int QTY) : base(QTY) { }
我想要发生的是当调用 Fish(int QTY) 时,我希望它调用 Fish() 来设置基础知识,然后调用 Consumable(QTY) 来设置数量。
但是目前,当调用 Fish(int QTY) 时,它会调用 Consumable(QTY),后者调用 Consumable() 而不是 Fish()
有什么方法可以使它按照我正在寻找的方式工作吗?
编辑:正如一些评论中已经建议的那样,这里有一个可能的解决方案,其中包含从两个构造函数调用的 init-method 。 Fish(qty) 现在调用基础构造函数和自己的 Init-method(与 Fish() 相同)。
public Fish() : base() {
Init();
}
public Fish(int QTY) : base(QTY){
Init();
}
private void Init(){
name = "fish";
ID = 1;
variant = 0;
maxStack = 20;
desc = "A Fish of some kind";
rarity = ItemRarity.Common;
}
CLR 首先创建 Baseclass 实例而不是 Childclass。并且没有办法影响它。在您的情况下,我建议创建方法 Initialize。 .net fiddle example
消耗品class
public void Initialize(){
Console.WriteLine("Consumable.Initialize()");
quantity = 1;
}
public void Initialize(int Quantity){
Console.WriteLine("Consumable.Initialize(QTY)");
if (quantity <= maxStack)
quantity = Quantity;
else
quantity = maxStack;
}
和鱼
public Fish(int QTY){
Initialize(QTY);
}
public void Initialize(){
Console.WriteLine("Fish.Initialize()");
name = "fish";
ID = 1;
variant = 0;
maxStack = 20;
}
public void Initialize(int QTY) {
Console.WriteLine("Fish.Initialize(QTY)");
Initialize();
base.Initialize(QTY);
}
输出: