Цепочка конструктора в сочетании с вызовом базового конструктора - PullRequest
6 голосов
/ 26 февраля 2011

Скажите, у меня есть следующее:

class Base {
    public Base (int n) { }
    public Base (Object1 n, Object2 m) { }
}

class Derived : Base {

    string S;

    public Derived (string s, int n) : base(n) {
        S = s;
    }

    public Derived (string s, Object1 n, Object2 m) : base(n, m) {
        S = s; // repeated
    }
}

Обратите внимание, что мне нужен формальный аргумент n в обеих перегрузках Derived, и поэтому я должен повторить строку N = n;.

Теперь я знаю, что это может быть заключено в отдельный метод, но вам все равно нужны одни и те же два вызова метода из обеих перегрузок. Итак, есть ли более «элегантный» способ сделать это, возможно, используя this в сочетании с base?

Это так, что у меня может быть личный конструктор, принимающий один аргумент s, а две другие перегрузки могут вызывать его ... или это может быть то же самое, что иметь отдельный закрытый метод?

Ответы [ 2 ]

5 голосов
/ 26 февраля 2011

Идеального решения для этого не существует. Есть способ избежать повторения кода в конструкторах Derived, но тогда вам придется повторить значение по умолчанию параметра m:

public Derived (string s, int n) : this(s, n, 0) {}
0 голосов
/ 26 февраля 2011

Только небольшое улучшение, но ...

class Derived : Base
{
    string S;
    public Derived(string s, int n) : this(s,n,-1)
    {
    }

    public Derived(string s, int n, int m) : base(n, m)
    {
        S = s;
        // repeated    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...