如何正确使用:base()和:this()
本文关键字:this 何正确 base | 更新日期: 2023-09-27 18:22:25
我已经在SO和其他网站上搜索过这个问题,但我还没有找到(或找到)适合我的案例的解决方案。
我有一个名为EnteBase
的抽象类,我将其用作其他两个类Regione
和Provincia
的基(duh!)。
EnteBase
:
public abstract class EnteBase
{
public EnteBase ()
: this( "Sconosciuto", 0 )
{
}
public EnteBase ( string nome )
: this( nome, 0 )
{
}
public EnteBase ( string nome, int numeroComuni )
{
this.Nome = nome;
this.NumeroComuni = numeroComuni;
}
private string nome;
public string Nome
{
[...]
}
private int numeroComuni;
public int NumeroComuni
{
[...]
}
}
Regione
:
public class Regione : EnteBase
{
public List<Provincia> Province
{
[...]
}
public Regione ()
: base()
{
this.Province = new List<Provincia>();
}
public Regione ( string nome )
: this()
{
}
public Regione ( string nome, int numeroComuni )
: this()
{
}
public void AggiungiProvincia ( Provincia provincia )
{
Province.Add( provincia );
}
}
Provincia
:
public class Provincia : EnteBase
{
private string sigla;
public string Sigla
{
[...]
}
public Provincia ()
: base()
{
}
public Provincia ( string nome )
: this()
{
this.Nome = nome;
}
public Provincia ( string nome, int numeroComuni )
: this()
{
this.Nome = nome;
this.NumeroComuni = numeroComuni;
}
public Provincia( string nome, int numeroComuni, string sigla)
: this()
{
this.Nome = nome;
this.NumeroComuni = numeroComuni;
this.Sigla = sigla;
}
}
我的问题如下:
- 在基类的所有构造函数中使用
:this()
是否正确,除了参数最多的构造函数,其他构造函数指向后者 - 使用指向类
Provincia
和Regione
中的基构造函数的:this()
,然后从方法本身内部分配给字段,这正确吗
我的问题源于我想在每种方法中同时使用:this()
和:base()
。当我发现这是不可能的时候,我寻找了一个解决方案,但我找不到一种方法来应用我在这个问题和这个问题中看到的。
附言:在构造函数中,首选this.FieldName
还是仅使用FieldName
?
在基类的所有构造函数中使用:this()正确吗除了参数最多的那个,其他的都指向后者?
唯一的用例是构造函数链接,您可以将初始化工作最小化到一个构造函数,并让所有其他构造函数使用this()
和导致该构造函数执行的参数——您已经在EnteBase
类中这样做了。
空的base()
调用通常是无用的,因为默认情况下无论如何都会调用默认的基构造函数。
一个空的this()
调用走错了路,通常也没有用(除非你有一些不依赖于参数的初始化工作)-你应该传递参数一个调用了更多参数的构造函数,最终在一个完成所有工作的构造函数处结束。
使用:this()指向类Provincia和Regione中的基构造函数,然后从方法本身内部分配给字段,这正确吗?
在C#中,对:base()
的调用是隐式的,因此不需要显式执行。
因此,在您的示例中,您不需要调用:this()
,因为所有这些都是调用基本的无参数构造函数。
在基类的所有构造函数中使用:this()是否正确,除了参数最多的构造函数,其他构造函数指向后者?
是的,这是一种为值提供合理默认值的常见方法。
您应该将subclass
中的以下Constructor
更改为:
public Provincia ( string nome, int numeroComuni )
: this()
{
this.Nome = nome;
this.NumeroComuni = numeroComuni;
}
收件人:
public Provincia ( string nome, int numeroComuni )
: base(nome, numeroComuni)
{
}
AND在以下Constructor
中相同,来自:
public Provincia( string nome, int numeroComuni, string sigla)
: this()
{
this.Nome = nome;
this.NumeroComuni = numeroComuni;
this.Sigla = sigla;
}
收件人:
public Provincia( string nome, int numeroComuni, string sigla)
: base(nome, numeroComuni)
{
this.Sigla = sigla;
}
消除了在subclass
中设置superclass
的属性的需要,正如superclass
的实现所期望的那样。