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

标签 c# inheritance namespaces package

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

我本来想做这样的事情:

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/

相关文章:

c# - 如何将抛出的异常映射到事件 ID 以进行日志记录?

ios - 是否可以创建一个继承自 AVCaptureDevice 的类?

c# - 在 C# 中向现有代码添加自定义功能的最佳方式是什么?

c++ - 重载默认构造函数导致错误

具有单例用法的 JavaScript 命名空间?我难住了!

namespaces - Kentico 导入自定义命名空间,无法识别程序集

c# - 从 C# 代码使用 C 库

c# - .NET C# 同步接收不阻塞

c# - 将 SQL 查询转换为 LINQ -- 运算符 '&&' 不能应用于类型 'int' 和 'bool' 的操作数

c# - 在类库中隐藏仅包含内部类型的 namespace ?