вызовите конструктор this () и другой конструктор base () - PullRequest
0 голосов
/ 27 августа 2018

У меня есть несколько классов, которые расширяют родительский класс.вот так:

public abstract class EasyUIELementFoundation
{
    protected GameObject UIElement;
    private RectTransform RectOptions;
    private Vector2 _position;
    private Vector2 _dimensions;

    protected Vector2 Position
    {
        get
        {
            return _position;
        }
        set
        {
            RectOptions.pivot = value;
            _position = value;
        }
    }

    protected Vector2 Dimensions
    {
        get
        {
            return _dimensions;
        }
        set
        {
            RectOptions.sizeDelta = value;
            _dimensions = value;
        }
    }

    protected EasyUIELementFoundation()
    {
        UIElement = new GameObject();
        RectOptions = UIElement.AddComponent(typeof(RectTransform)) as RectTransform;
    }

    protected EasyUIELementFoundation(Vector2 position) : this()
    {
        _position = position;
    }

    protected EasyUIELementFoundation(Vector2 position, Vector2 dimensions) : this()
    {
        _dimensions = dimensions;
        _position = position;
    }
}

public class EasyRawImage : EasyUIELementFoundation
{
    private RawImage UIImageComponent;
    private Texture2D _image;

    public Texture2D Image
    {
        get
        {
            return _image;
        }
        set
        {
            UIImageComponent.texture = value;
            _image = value;
        }
    }

    public EasyRawImage() : base()
    {
        UIImageComponent = UIElement.AddComponent(typeof(RawImage)) as RawImage;
    }

    public EasyRawImage(UnityEngine.Object image, Vector2 position) : this() : base(position)  
    // here is the error it is not possible to call the base.
    {
         //some code...
    }
}

Так что моя проблема в том, что у меня есть 3 разных конструктора базового класса, и из производного класса я хочу вызвать разные конструкторы базового класса, но я не могу atm.Возможно ли это, если нет, как бы я поступил так?

Если что-то неясно, дайте мне знать, чтобы я мог уточнить.
Я полный новичок в ООП, так что извините, если этонемного странный вопрос.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы не можете вызывать this и базовый конструктор одновременно.Обычно лучший подход, как уже упоминалось в комментарии, - сначала реализовать конструктор, который является наиболее сложным (имеет большинство параметров), и вызвать базовый класс.Затем заставьте более простой конструктор вызвать сложные со значениями по умолчанию.При таком подходе ваш класс будет выглядеть так:

public class EasyRawImage : EasyUIELementFoundation
{
    private RawImage UIImageComponent;
    private Texture2D _image;

    public Texture2D Image
    {
        get
        {
            return _image;
        }
        set
        {
            UIImageComponent.texture = value;
            _image = value;
        }
    }

    public EasyRawImage() : this(default(UnityEngine.Object), default(Vector2))
    {
    }

    public EasyRawImage(UnityEngine.Object image, Vector2 position) : base(position)
    {
         UIImageComponent = UIElement.AddComponent(typeof(RawImage)) as RawImage;
         //some code...
    }
}
0 голосов
/ 27 августа 2018

Invoking this() вызовет базовый конструктор, неявно или явно.Поэтому второй вызов base будет во второй раз, когда вы создаете тот же объект, что недопустимо.

Вы можете поделиться кодом конструктора, создав частный вспомогательный метод, например так:

public class EasyRawImage : EasyUIELementFoundation
{
    private RawImage UIImageComponent;
    private Texture2D _image;

    public Texture2D Image
    {
        get
        {
            return _image;
        }
        set
        {
            UIImageComponent.texture = value;
            _image = value;
        }
    }

    public EasyRawImage() : base()
    {
        InitUiImageComponent();
    }

    public EasyRawImage(UnityEngine.Object image, Vector2 position) : base(position)  
    {
        InitUiImageComponent();
         //some code...
    }
    private void InitUiImageComponent() {
        UIImageComponent = UIElement.AddComponent(typeof(RawImage)) as RawImage;
    }

}

В вашем конкретном случае код инициализации может быть помещен непосредственно в инициализатор, поэтому вспомогательный метод становится ненужным:

public class EasyRawImage : EasyUIELementFoundation
{
    private RawImage UIImageComponent = UIElement.AddComponent(typeof(RawImage));
    private Texture2D _image;

    public Texture2D Image
    {
        get
        {
            return _image;
        }
        set
        {
            UIImageComponent.texture = value;
            _image = value;
        }
    }

    public EasyRawImage() : base()
    {
    }

    public EasyRawImage(UnityEngine.Object image, Vector2 position) : base(position)  
    {
         //some code...
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...