gpt4 book ai didi

c# - 包/命名空间的继承 [C#]

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:37 24 4
gpt4 key购买 nike

我想在保持层次结构的同时在子包中重新定义包的类。

我本来想做这样的事情:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com