【问题标题】:Inheritance with packages/namespaces [C#]使用包/命名空间继承 [C#]
【发布时间】:2017-09-27 11:35:46
【问题描述】:

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

我本来想做这样的事情:

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#不支持多重继承,但我不知道解决这种重定义的最佳方法。

接口不能解决我的问题。我可以使用组合来做类似的事情:

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;
}

解决我的问题的最佳方法是什么?

【问题讨论】:

    标签: c# inheritance namespaces package


    【解决方案1】:

    使用composition 代替继承。

    很难直接举个例子,因为您没有为您的 RPG 演员/角色提供任何动作,但概念是您将行为注入到类的构造函数中。

    在这种情况下,“移动”是行为:

    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")
        {
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个。

      namespace RPG {
      
        public class Actor {
      
        public void d(){
        System.Console.Write("fhdf");
        }
      
        }
      
        public class Character : Actor {}
      }
      
      
      ////////////////
      public class Character :  RPG.Character {}
      class Program
      {
          static void Main()
          {
              Character c = new Character();
              c.d();
              Console.WriteLine("Hello, World!");
          }
      }
      

      【讨论】:

      • 这是做什么的?这如何回答这个问题?
      • 是继承层次结构。从子类继承可以访问树中所有父类的所有公共成员。(例如,A 是父类 B 是命名空间 Z 中的子类,D 是另一个命名空间中 B 的子类,则 B 可以访问 A 的公共成员。
      猜你喜欢
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2020-03-20
      • 2013-08-13
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      相关资源
      最近更新 更多