关于c#:具有多态性和继承的类设计

Class Design with Polymorphism and Inheritance

我目前有以下几点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class CharacterClass
    {

        public abstract Attribute FirstAttributeBonus { get; }
        public abstract Attribute SecondAttributeBonus { get; }

        protected Attribute[] attributeBonuses; //2 attribute bonuses, which add 10 to the attributes stored in the array.
        protected SKill[] majorSkills; //Major skills for class begin at 30.
        protected Skill[] minorSkills; //Minor skills for class begin at 15.

        protected IDictionary<int, Character> characterList; //List of characters who apply to this class specifically.

        public CharacterClass()
        {

        }

    }

考虑到我创建的任何类都将从此基继承,并且还将继承类字段。例如,一个类可以是战士,另一个类可以是战斗法师等。

在让派生构造函数初始化字段的同时,这是执行这种设计的正确方法吗?或者在不继承这些字段的情况下写出类更好吗?

编辑:

我忘了说所有的派生词都是单例的,我将类的名称改为"characterClass",以避免混淆。


我想你不是指哪个类,而是指所有的游戏对象类?在这种情况下,如果所有的游戏对象真的需要这些属性,它可能是一个好的设计。

抽象基类的作用是在那里收集公共代码,以消除子类中的重复。如果所有的游戏对象子类都需要这些字段,那么将它们放在基类中是正确的。如果不同的游戏对象子类将它们初始化为不同的值,则将初始化推迟到子类是正确的。

强制初始化这些字段的一种可能性是在基类中提供一个非默认的构造函数,要求子类将init值作为参数传递给ctor。

我假设您是指一个构造函数示例?更改现有的

1
2
3
public CharacterClass()
{
}

变成

1
2
3
4
5
6
7
8
9
10
public CharacterClass(Attribute[] attributeBonuses,
  SKill[] majorSkills, Skill[] minorSkills)
{
  if(attributeBonuses == null || majorSkills == null || minorSkills == null)
    throw new ArgumentException("Null values are not allowed");

  this.attributeBonuses = attributeBonuses;
  this.majorSkills = majorSkills;
  this.minorSkills = minorSkills;
}


你绝对需要得到一本书叫做"头开始设计模式"。您不需要阅读整本书:它的第一章描述了您想要实现的设计模式。

基本上,您希望您的角色类具有调用包含实现代码的类的接口,例如技能类、属性类以及稍后要添加的所有其他类。这样,您就可以添加新类型的技能和属性,并且还可以在运行时修改这些技能和属性。您不希望字符类包含所有可能的实现。对于您要做的事情,您希望选择对象组合而不是继承。

花20分钟阅读第一章:http://oreilly.com/catalog/9780596007126/preview


如果受保护的抽象字段对于所有派生类都是通用的,那么我认为持有这些字段没有什么特别的错误,尽管我确实推荐了Anders给出的解决方案。

不过,我特别不喜欢的是江户记1(2)。

我假设你的Character在内部有一个CharacterClass引用,这样你就可以在需要的时候访问细节,而且,正如看起来的那样,你将在CharacterCharacterClass之间创建一个循环。看来你让characterClass承担了太多的责任。我将把责任转移到别处,把某个特定角色类的所有角色都保留下来。


我觉得这很难闻。这段代码甚至还有一个名字:上帝等级。

在我看来,创建一个"母亲"(或上帝)类并不是一个好主意,所有其他类都继承自这个类。

我在您的基类中看到一些属性,如MajorSkills。我看到你会有一个类"EDOCX1"(1),你会从这个基本类继承它,但是,我认为一个图像没有技巧。我将创建更具体的基类,并且仅当存在IS关系时从这些基类继承。