Как правильно использовать: base () и: this ()? - PullRequest
2 голосов
/ 05 февраля 2012

Я уже искал эту проблему как на SO, так и на других сайтах, но мне не удалось найти (или найти) решение для моего дела.

У меня есть абстрактный класс с именем EnteBase, который я использую в качестве основы ( Дух! ) для двух других классов, Regione и Provincia.


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() во всех конструкторах базового класса, кроме одного с большинством параметров, а остальные указывают на последний?
  • Правильно ли использовать :this(), указывающее на базовый конструктор в классах Provincia и Regione, а затем назначать поля изнутри самого метода?

Моя проблема коренится в том, что я хотел использовать как :this(), так и :base() в каждом методе. Когда я обнаружил, что это невозможно, я искал решение, но не смог найти способ применить то, что видел в этом вопросе и этом .

P.S .: в конструкторах, предпочтительно использовать this.FieldName или просто FieldName?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2012

Правильно ли использовать: this () во всех конструкторах базового класса, кроме одного с большинством параметров, а остальные указывают на последний?

Единственный вариант использованияэто связывание конструктора, когда вы минимизируете свою работу по инициализации для одного конструктора и все другие конструкторы используют this() с параметрами, которые вызывают выполнение этого конструктора - вы делаете именно это уже в вашем EnteBase классе.

Anпустой base() вызов, как правило, бесполезен, так как базовый конструктор по умолчанию вызывается по умолчанию в любом случае.

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

1 голос
/ 05 февраля 2012

Вы должны изменить следующие Constructor в subclass с:

public Provincia ( string nome, int numeroComuni )
    : this()
{
    this.Nome = nome;
    this.NumeroComuni = numeroComuni;
}

На:

public Provincia ( string nome, int numeroComuni )
    : base(nome, numeroComuni)
{
}

И то же самое в следующем Constructor, начиная с:

public Provincia( string nome, int numeroComuni, string sigla)
    : this()
{
    this.Nome = nome;
    this.NumeroComuni = numeroComuni;
    this.Sigla = sigla;
}

To:

public Provincia( string nome, int numeroComuni, string sigla)
    : base(nome, numeroComuni)
{
    this.Sigla = sigla;
}

Устранение необходимости устанавливать свойства superclass вsubclass, как предусмотрено реализацией superclass es.

1 голос
/ 05 февраля 2012

Правильно ли использовать: this (), указывающий на базовый конструктор в классах Provincia и Regione, а затем назначать поля изнутри самого метода?

В C # вызов :base() неявный, поэтому его не нужно делать явно.

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

* * 1010

Правильно ли использовать: this () во всех конструкторах базового класса, кроме одного с большинством параметров, а остальные указывают на последний?

Это обычный способ придания значениям разумных значений по умолчанию, да.

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