C# 从“:Base”构造函数正确访问参数

C# 从“:Base”构造函数正确访问参数,c#,class,oop,constructor,C#,Class,Oop,Constructor,处境 我正在制作一个基于文本的小游戏,使用我在本学年学到的一些OOP实践,我这样做的原因主要是为了改进我目前知道的OOP,并希望在有经验的用户的帮助下改进我的一些实践 所以,用外行的话说,我现在有一个Ork类,它在扩展敌人,敌人在扩展实体 public class Ork : Enemy public class Enemy : Entity 我有敌人类,因为我打算制造许多独特的敌人对象类型,而不仅仅是Ork,通过目前的设置,我可以以同样的方式制造精灵或人类。而且在将来添加新类型会容易得多,

处境

我正在制作一个基于文本的小游戏,使用我在本学年学到的一些OOP实践,我这样做的原因主要是为了改进我目前知道的OOP,并希望在有经验的用户的帮助下改进我的一些实践

所以,用外行的话说,我现在有一个Ork类,它在扩展敌人,敌人在扩展实体

public class Ork : Enemy

public class Enemy : Entity
我有敌人类,因为我打算制造许多独特的敌人对象类型,而不仅仅是Ork,通过目前的设置,我可以以同样的方式制造精灵或人类。而且在将来添加新类型会容易得多,因为敌人有自己的构造函数

public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold, string Name, string Type,
        string Spawnzone, string _Class, int Defaultlevel, int Maxlevel, string trait, int str, int agi, int dex, int hel, int man)
    {
        //make a new entity instance.
        entity = new Entity();

        //Set all the local variables to the passed in parameters.

        setEntity(Name, Type, Spawnzone, _Class, Defaultlevel, Maxlevel, trait, str, agi, dex, hel, man);

        droplist = Droplist;
        defaultgold = Defaultgold;
        weaknesses = Weaknesses;
        resistances = Resistances;
        taunts = Taunts;
        aggro = Aggro;
        critchance = Critchance;
        threshold = Threshold;

}
如您所见,我将传入参数设置为局部变量,并使用setEntity为我做了一些这方面的工作。我还有一个实体类,原因是,并不是所有有统计数据的东西都是敌人,所以我有实体作为中间人

问题

问题是在这一行类的末尾,Ork类

在其他程序中,例如,我的Hillracing程序,类似类的构造函数如下所示:

public JuniorMember(string stringfirstname, string stringlastname, string stringmiddlename, string stringtitle, string strst, string strtwn, string strpc, string strEmail, int intMobile, int intHome,
            string shrnumber, string memtype, string username, string password, int noracesrun, float perraceswon, string mempic, string memclub, string gender, int memexp, int yearofbirth, int monthofbirth, int dayofbirth, string nextofkin, string docName, string docTel, string healthIssues, string parentalConsent)
            : base(stringfirstname, stringlastname, stringmiddlename, stringtitle, strst, strtwn, strpc, strEmail, intMobile, intHome, shrnumber, memtype, username, password, noracesrun, perraceswon, mempic, memclub,
            gender, memexp, yearofbirth, monthofbirth, dayofbirth)
        {
public class Entity {
    // other code

    public Entity(string Type, string Spawnzone, string _Class, int Defaultlevel, int Maxlevel, string trait, int str, int agi, int dex, int hel, int man) {
        // move setEntity code here.
    }

    // other code
}

public class Enemy {

    // other code

    public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold, string Name, Entity entity) {
            this.entity = entity;

            droplist = Droplist;
            defaultgold = Defaultgold;
            weaknesses = Weaknesses;
            resistances = Resistances;
            taunts = Taunts;
            aggro = Aggro;
            critchance = Critchance;
            threshold = Threshold;
    }

    // other code
}   
所以,问题是,简单地说,在这个程序中,我看到了相似数量的参数,而对于我个人来说,看到这些参数,我觉得我做得不对

我在Hillracing中给出的例子完美无瑕,但我只是想知道这是否是实现这一点的最佳方式,因为参数列表看起来很凌乱,感觉好像我正在创建以前已经创建过的东西。我的意思是,创建Ork对象所需的90%的信息来自其他地方

编辑

由于发表的评论,我移除了我在敌人职业中创建的新实体,我现在拥有以下敌人职业:

public class Enemy : Entity
{

    private string[] droplist;

    private int defaultgold;

    private string weaknesses;

    private string resistances;

    private string[] taunts;

    private string aggro;

    private string critchance;

    private string threshold;


    public string[] Droplist { get { return droplist; } set { droplist = value; } }
    public int Defaultgold { get { return defaultgold; } set { defaultgold = value; } }
    public string Weaknesses { get { return weaknesses; } set { weaknesses = value; } }
    public string Resistances { get { return resistances; } set { resistances = value; } }
    public string[] Taunts { get { return taunts; } set { taunts = value; } }
    public string Aggro { get { return aggro; } set { aggro = value; } }
    public string Critchance { get { return critchance; } set { critchance = value; } }
    public string Threshold { get { return threshold; } set { threshold = value; } }




    public void setEntity(string EnName, string EnType, string EnSpawnzone, string En_Class, int EnDefaultlevel, int EnMaxlevel, string Entrait, int Enstr, int Enagi, int Endex, int Enhel, int Enman)
    {


        setStats(Enstr, Enagi, Endex, Enhel, Enman);

        Name = EnName;
        Type = EnType;
        Spawnzone = EnSpawnzone;
        _Class = En_Class;
        Defaultlevel = EnDefaultlevel;
        Maxlevel = EnMaxlevel;
        trait = Entrait;

    }

    public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold) 

        :base(Name,Type,Spawnzone,_Class,Defaultlevel,Maxlevel,trait,str,agi,dex,hel,man)
    {

        //Set all the local variables to the passed in parameters.

        setEntity(Name, Type, Spawnzone, _Class, Defaultlevel, Maxlevel, trait, str, agi, dex, hel, man);

        droplist = Droplist;
        defaultgold = Defaultgold;
        weaknesses = Weaknesses;
        resistances = Resistances;
        taunts = Taunts;
        aggro = Aggro;
        critchance = Critchance;
        threshold = Threshold;

}
我这里的问题是,我不知道如何从实体获取信息,此时,我无法访问名称、类型、产卵区等变量,因为它们需要对象引用。

实体应该是一个基类,敌人使用并非所有实体都具有的附加统计数据扩展它。从敌人的构造函数中,您应该调用父实体构造函数。这是有道理的,因为敌人是一个实体

然而,目前,你的设置是这样的,敌人有一个实体,这是没有意义的

编辑

您已经有了:

public class Ork : Enemy
我是说,你还需要有这个:

public class Enemy : Entity
我认为类基类构造函数是自动生成的,所以你不需要做任何其他事情。只需在实体构造函数中执行所有实体的通用操作,在敌人中执行敌人的通用操作,等等。

注意:我看到您刚刚进行了编辑,以澄清您的敌人类扩展了实体。那我就不明白为什么要在敌人的构造函数中实例化一个实体类。实体和敌人之间的逻辑关系是什么?敌人是一种实体吗?或者,敌人有实体吗

也许您可以考虑将实体实例传递给敌人构造函数,以避免必须将实体类的所有单独组件传递给敌人构造函数。大概是这样的:

public JuniorMember(string stringfirstname, string stringlastname, string stringmiddlename, string stringtitle, string strst, string strtwn, string strpc, string strEmail, int intMobile, int intHome,
            string shrnumber, string memtype, string username, string password, int noracesrun, float perraceswon, string mempic, string memclub, string gender, int memexp, int yearofbirth, int monthofbirth, int dayofbirth, string nextofkin, string docName, string docTel, string healthIssues, string parentalConsent)
            : base(stringfirstname, stringlastname, stringmiddlename, stringtitle, strst, strtwn, strpc, strEmail, intMobile, intHome, shrnumber, memtype, username, password, noracesrun, perraceswon, mempic, memclub,
            gender, memexp, yearofbirth, monthofbirth, dayofbirth)
        {
public class Entity {
    // other code

    public Entity(string Type, string Spawnzone, string _Class, int Defaultlevel, int Maxlevel, string trait, int str, int agi, int dex, int hel, int man) {
        // move setEntity code here.
    }

    // other code
}

public class Enemy {

    // other code

    public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold, string Name, Entity entity) {
            this.entity = entity;

            droplist = Droplist;
            defaultgold = Defaultgold;
            weaknesses = Weaknesses;
            resistances = Resistances;
            taunts = Taunts;
            aggro = Aggro;
            critchance = Critchance;
            threshold = Threshold;
    }

    // other code
}   
我假设您的敌人类包含实体的实例。对你来说,这是一种错误的做法。若您的敌人类是通过实体扩展的,那个么您可以使用它的构造函数将泛型值设置为父类。就像你在爬山计划中做的那样

确保你的敌人类没有实体类型的成员。如果它是敌人的基地


}

敌人确实扩展了实体。公众阶级敌人:你确定吗?目前,您似乎正在敌人的构造函数中创建实体的新实例。不一定是错误的,但这并不是扩展类,不是。扩展类就像您从敌人或其他人那里做的一样。要完成层次结构,您需要执行以下操作:实体到敌人工作,而不是在敌人内部创建实体对象。好吧,假设我删除了那行代码,我将用什么替换它?从敌人到实体?敌人是一种实体。就像玩家或物品可以是一种实体。逻辑推理是实体类包含物品,这些物品将来将被物品、敌人和玩家使用。就像统计数据一样,一切都有统计数据。很抱歉造成混淆。您能提供一个示例吗?您可以使该方法不带任何参数,这些参数将转换为类内的属性,如果这些属性在实体之间是公共的,您可以为该实体创建一个接口,您的敌方类中不应该有实体变量,因为它本身已经是一个实体。检查编辑,我从敌方类中删除了实体实例。在本例中,这可能并不完全相关,因为它不是讨论的重点,但通常避免从属性返回数组是一种良好的做法。考虑使用集合,或者将这些属性更改为方法。