Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用此()构造函数和不同的base()构造函数_C#_Class_Oop_Constructor_Base Class - Fatal编程技术网

C# 调用此()构造函数和不同的base()构造函数

C# 调用此()构造函数和不同的base()构造函数,c#,class,oop,constructor,base-class,C#,Class,Oop,Constructor,Base Class,我有一些类都扩展了父类。像这样: public abstract class EasyUIELementFoundation { protected GameObject UIElement; private RectTransform RectOptions; private Vector2 _position; private Vector2 _dimensions; protected Vector2 Position {

我有一些类都扩展了父类。像这样:

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个不同的基类构造函数,从派生类我想调用不同的基类构造函数,但我不能。如果不可能的话,这是可能的吗?我该怎么做这样的事情呢

如果有任何不清楚的地方,请告诉我,以便我可以澄清。
我是一个完全的OOP新手,如果这是一个有点奇怪的问题,我很抱歉

调用
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;
    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...
    }
}
在您的特定情况下,初始化代码可以直接放入初始值设定项中,因此助手方法变得不必要:

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

}

不能同时调用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() : 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;
    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...
    }
}
EasyRawImage(UnityEngine.Object image,Vector2位置):this():base(位置)
这不起作用。。实际上,大多数时候,当我构建一个构造函数时,我从最复杂的构造函数开始。然后继续使用简单的构造函数,但使用默认值显式调用复杂构造函数。示例:
public EasyRawImage():base()
将需要调用
this(null,null)
,然后
public EasyRawImage(UnityEngine.Object image,Vector2 position):base(position)
在使用它们之前实际检查参数。但在某些情况下,这有点糟糕。