调用 this() 构造函数和不同的 base() 构造函数
call this() constructor and different base() constructor
我有一些 class 都扩展了父 class。像这样:
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 个不同的基础 class 构造函数,我想从派生的 class 调用不同的基础构造函数,但我不能 atm。这甚至可能吗?如果不能,我将如何做这样的事情?
如果有任何不清楚的地方,请告诉我,以便我澄清。
我是 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 = 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 和基础构造函数。通常最好的方法是如评论中已经提到的那样,首先实现最复杂(具有最多参数)的构造函数并调用基础 class。然后让更简单的构造函数使用默认值调用复杂的构造函数。
使用这种方法,您的 class 将最终看起来像这样:
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...
}
}
我有一些 class 都扩展了父 class。像这样:
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 个不同的基础 class 构造函数,我想从派生的 class 调用不同的基础构造函数,但我不能 atm。这甚至可能吗?如果不能,我将如何做这样的事情?
如果有任何不清楚的地方,请告诉我,以便我澄清。
我是 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 = 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 和基础构造函数。通常最好的方法是如评论中已经提到的那样,首先实现最复杂(具有最多参数)的构造函数并调用基础 class。然后让更简单的构造函数使用默认值调用复杂的构造函数。 使用这种方法,您的 class 将最终看起来像这样:
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...
}
}