我想在保持层次结构的同时在子包中重新定义包的类。
我本来想做这样的事情:
namespace RPG {
public class Actor {}
public class Character : Actor {}
}
public class Actor : RPG.Actor {}
//kind of a diamond problem
public class Character : Actor, RPG.Character {}
我知道这是不正确的; C# 不支持多重继承,但我不知道解决这种重定义的最佳方法。
接口(interface)不能解决我的问题。我可以使用组合来做类似的事情:
public class Character : Actor {
private RPG.Character basis;
// and do this for each attribute and method
public int atk { get { return basis.atk } set { basis.atk = value; } }
}
但是看起来不太好。而且,我用这种方式遇到了另一个问题
namespace RPG {
public class Actor {
public List<Stat> stats { get; set; }
}
public class Stat {}
}
public class Actor {
private RPG.Actor basis;
//I can't do that because Stat does not inherit from RPG.Stat
public override List<RPG.Stat> stats { get; set; }
}
public class Stat {
private RPG.Stat basis;
}
解决我的问题的最佳方法是什么?
最佳答案
使用composition而不是继承。
很难画一个直接的例子,因为你没有为你的角色扮演游戏 Actor /角色提供任何 Action ,但概念是你将行为注入(inject)到你的类的构造函数中。
在这种情况下,“移动”是行为:
class Fighter
{
public int Health = 100;
public string Name;
private Move _move;
public string MoveName
{
get
{
return _move.Name;
}
}
public int MoveDamage
{
get
{
return _move.Damage;
}
}
public Fighter(string name, Move defaultMove)
{
Name = name;
_move = defaultMove;
}
public void Attack(Fighter defendant)
{
if (_move != null)
_move.Attack(defendant);
}
public void SetMove(Move move)
{
if (move != null)
_move = move;
}
}
abstract class Move
{
public int Damage { get; set; }
public string Name { get; set; }
protected Move(int damage,string name)
{
Damage = damage;
Name = name;
}
public void Attack(Fighter defendant)
{
defendant.Health -= Damage;
}
}
class PunchMove:Move
{
public PunchMove() : base(5, "Punch")
{
}
}
class KickMove:Move
{
public KickMove() : base(7, "Kick")
{
}
}
关于c# - 包/命名空间的继承 [C#],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43695635/