簡體   English   中英

如何在派生構造函數中設置基類的值

[英]How to set base class the values in the derived constructor

所以我有這個基礎課

abstract class Item
{
    private int x, y, ataque, defesa, saude, raridade;
    private char appearance;
    private bool pickedUp;
    private readonly Random rng = new Random();

    public Item(Map argMap, int argAtaque, int argDefesa, int argSaude, int argRaridade, char argAppearance)
    {
        bool empty = false;
        while (!empty)
        {
            x = rng.Next(1, argMap.ReLengthX() - 1);
            y = rng.Next(1, argMap.ReLengthY() - 1);
            if (!argMap.CheckTile(y, x)) empty = true;
        }
        pickedUp = false;
        ataque = argAtaque;
        defesa = argDefesa;
        saude = argSaude;
        raridade = argRaridade;
        appearance = argAppearance;
    }
}

我得到了這個派生類

class Armadura : Item
{
    public Armadura(Map argMap, int ataque, int defesa, int saude, int raridade, char appearance) : base(argMap, ataque, defesa, saude, raridade, appearance)
    {
        ataque = -1;
        defesa = 2;
        saude = 0;
        raridade = ReRNG().Next(Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.02)), Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.04)));
        appearance = ' ';
    }
}

所以我的問題是,如何使用在派生構造函數上設置的值來設置:base上的值(例如,將基本argAtaque設置為ataquewwww,因此argAtaque等於“ -1”)? 我嘗試了幾種方法,但沒有以任何方式使它起作用。 我提前謝謝你!

: base()語法適用於常量和參數,但不適用於具有副作用的復雜表達式(如您所見)。

您將需要在基類上使用初始化方法。

abstract class Item
{
    ...

    // If you use this constructor, call Setup() afterwards.
    public Item() {}

    // Constructor including a call to Setup()
    public Item(Map argMap, int argAtaque, int argDefesa, int argSaude, int argRaridade, char argAppearance)
    {
        Setup(argMap, argAtaque, argDefesa, argSaude, argRaridade, argAppearance);
    }

    // Sets private variables for this Item
    protected void Setup(Map argMap, int argAtaque, int argDefesa, int argSaude, int argRaridade, char argAppearance)
    {
        bool empty = false;
        while (!empty)
        {
            x = rng.Next(1, argMap.ReLengthX() - 1);
            y = rng.Next(1, argMap.ReLengthY() - 1);
            if (!argMap.CheckTile(y, x)) empty = true;
        }
        pickedUp = false;
        ataque = argAtaque;
        defesa = argDefesa;
        saude = argSaude;
        raridade = argRaridade;
        appearance = argAppearance;
     }
}

現在,您可以使用計算的值設置基類:

class Armadura : Item
{
    public Armadura(Map argMap) 
    {
        int ataque = -1;
        int defesa = 2;
        int saude = 0;
        int raridade = ReRNG().Next(Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.02)), Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.04)));
        char appearance = ' ';

        Setup(argMap, ataque, defesa, saude, raridade, appearance);
    }

您要做的就是在子構造函數中設置ataque,因為它將覆蓋在基類中設置的ataque。 首先調用基本構造函數,然后再調用子構造函數。

為此,您需要在基類中保護私有變量。 這將使它們在子類中變為私有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM