C#:在基础 class 中定义方法实现,在派生 classes 中定义属性
C#: Define methods implementation in base class and properties in derived classes
我正在制作一款游戏,其中有多种士兵,每种都有自己的属性(速度、攻击力...)。显然,他们所有人都可以行走、攻击……所以我认为用这些方法创建一个抽象的 class 士兵,以及每个单位属性的子classes 是合适的。问题是我不能在基础中使用派生 classes 的属性。
最简单的方法可能是在派生的 classes 中实现方法,但这意味着大量重复代码,我想避免它。事实上,这会使基数 class 变得不必要。
我已经尝试了几种方法。据我所知,我尝试过的最接近的解决方案是使用 abstract/virtual 属性,但我会再次为每个单元类型复制 "get" 代码。也许这无法避免,但如果可能的话,我愿意。
肯定存在一个我没有想到的简单解决方案。 ¿有什么想法吗?
我有这样的想法:
public abstract class Soldier {
public int AttackPower {
get { return this.power; }
}
public Attack {
Console.WriteLine("Attacked with "+AttackPower+" attack power");
}
}
public class Lancer:Soldier {
int power=5;
}
public class Archer:Soldier {
int power=10;
}
当然,这不是一个正确的解决方案,因为 Soldier class 不知道 "power" 变量,但是如果我在 Soldier 中声明 "power" 变量class,因为字段名称重复,我得到一个错误。
任何帮助将不胜感激。
你需要一个摘要属性:
public int AttackPower {
get { return this.power; }
}
protected abstract int Power { get; }
public class Lancer:Soldier {
protected override int Power { get { return 5; } }
}
如果您真的不喜欢属性,您也可以使用 "GetPower" 方法。正如您所发现的,如果基础 class 方法需要访问数据,您 必须 在基础 class.[=11= 中声明该数据]
不是代码重复,是类型安全!
为什么不直接在基数 class 中放一个 Power
属性?
public abstract class Soldier {
public int Power {get; set;}
public int AttackPower {
get { return this.Power; }
}
public Attack {
Console.WriteLine("Attacked with "+AttackPower+" attack power");
}
}
public class Lancer:Soldier {
public Lancer()
{
Power = 5
}
}
public class Archer:Soldier {
public Archer()
{
Power=10;
}
}
一些设计意见:
Archer
和 Lancer
是否需要不同的 classes,或者它们只是 Soldier
配置不同?
- 最好从数据源中提取 属性 值,而不是在源代码中对它们进行硬编码。您可以嵌入一个 XML 文件或其他文件,这样它就不容易编辑了。
我正在制作一款游戏,其中有多种士兵,每种都有自己的属性(速度、攻击力...)。显然,他们所有人都可以行走、攻击……所以我认为用这些方法创建一个抽象的 class 士兵,以及每个单位属性的子classes 是合适的。问题是我不能在基础中使用派生 classes 的属性。
最简单的方法可能是在派生的 classes 中实现方法,但这意味着大量重复代码,我想避免它。事实上,这会使基数 class 变得不必要。
我已经尝试了几种方法。据我所知,我尝试过的最接近的解决方案是使用 abstract/virtual 属性,但我会再次为每个单元类型复制 "get" 代码。也许这无法避免,但如果可能的话,我愿意。
肯定存在一个我没有想到的简单解决方案。 ¿有什么想法吗?
我有这样的想法:
public abstract class Soldier {
public int AttackPower {
get { return this.power; }
}
public Attack {
Console.WriteLine("Attacked with "+AttackPower+" attack power");
}
}
public class Lancer:Soldier {
int power=5;
}
public class Archer:Soldier {
int power=10;
}
当然,这不是一个正确的解决方案,因为 Soldier class 不知道 "power" 变量,但是如果我在 Soldier 中声明 "power" 变量class,因为字段名称重复,我得到一个错误。
任何帮助将不胜感激。
你需要一个摘要属性:
public int AttackPower {
get { return this.power; }
}
protected abstract int Power { get; }
public class Lancer:Soldier {
protected override int Power { get { return 5; } }
}
如果您真的不喜欢属性,您也可以使用 "GetPower" 方法。正如您所发现的,如果基础 class 方法需要访问数据,您 必须 在基础 class.[=11= 中声明该数据]
不是代码重复,是类型安全!
为什么不直接在基数 class 中放一个 Power
属性?
public abstract class Soldier {
public int Power {get; set;}
public int AttackPower {
get { return this.Power; }
}
public Attack {
Console.WriteLine("Attacked with "+AttackPower+" attack power");
}
}
public class Lancer:Soldier {
public Lancer()
{
Power = 5
}
}
public class Archer:Soldier {
public Archer()
{
Power=10;
}
}
一些设计意见:
Archer
和Lancer
是否需要不同的 classes,或者它们只是Soldier
配置不同?- 最好从数据源中提取 属性 值,而不是在源代码中对它们进行硬编码。您可以嵌入一个 XML 文件或其他文件,这样它就不容易编辑了。