2013-05-16 3 views
1

я реализовал класс, как показано ниже:управления Экземпляры класса

public class Person 
{ 
    public int d, e, f; 
    public Person() 
    { 
    } 

    public Person(int a) 
    { 
    } 

    public Person(int a, int b) 
    { 
     new Person(40, 6, 8); 
    } 

    public Person(int a, int b, int c) 
    { 
     d = a; e = b; f = c; 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     Person P = new Person(100, 200); 

     Console.WriteLine("{0},{1},{2}", P.d, P.e, P.f);// it prints 0,0,0 
    } 
} 

Теперь, если я создаю экземпляр Person класса с двумя аргументами я не могу установить значения D, E, F, который является потому что в третьем конструкторе новый объект Person объявляется вместе.

Таким образом, предыдущий объект не имеет никакого представления об этом новом.

Есть ли способ получить этот новый объект и присвоить значения d, e, f оттуда?

+0

http://stackoverflow.com/questions/10377888/how-can-i-use-multiple-constructors-to-remove-duplicated-code-while-maintaining –

ответ

7

Я думаю, что вы на самом деле пытается цепь конструкторов вместе, так что один конструктор передает аргументы другому:

public Person(int a, int b) : this(40, 6, 8) 
{ 
} 

Это странно, что вы игнорируете a и b хотя ... обычно вы 'd просто по умолчанию одно значение, например

public Person(int a, int b) : this(a, b, 8) 
{ 
} 

Для получения более подробной информации см. my article on constructor chaining.

+0

Привет, Jon, это не сценарий наследования. Я пытаюсь сделать это, я получаю ошибку времени компиляции, поскольку «Person.Person не может назвать себя». Все, что я хочу сделать, это главное, когда я пытаюсь напечатать значения d, e, f, я хочу, чтобы он был напечатан как 40, 6, 8. Возможно ли это, не создавая другую ссылку класса person, у которой есть этот новый объект, что-то вроде этого: public Person x = null; public Person (int a, int b) { x = новое лицо (40, 6, 8); } Console.WriteLine ("{0}, {1}, {2}", P.x.d, P.x.e, P.x.f); – ABCD

+0

@Saurabh: Тогда вы, должно быть, сделали что-то не так, потому что код, который я опубликовал *, * компилируется. Я только что проверил это сам. Просто изменить существующую двухпараметрическую конструкторскую перегрузку на одну из тех, которые я показал, это хорошо. Я никогда не упоминал о наследстве. К сожалению, трудно точно сказать, что вы сделали неправильно ... вам следует уйти от понятия наличия другой переменной 'Person' в вашем классе' Person' ... Я почти уверен, что вы * не хотите что. Вы должны сосредоточиться на разработке того, что вы сделали, по сравнению с кодом, который я показал (который действительно работает). –

+0

@Saurabh: Я думаю, что узнал, что вы сделали неправильно. Я подозреваю, что вы добавили ': this (40, 6, 8)' к конструктору, который принимает параметры * 3 *, а не тот, который принимает * два * параметра. Посмотрите внимательно на код, который я предоставил. –

1

Значение по умолчанию int равно 0. Используйте int? и проверьте, имеет ли оно значение.

например.

var d = P.d.HasValue ? P.d : ""; 
var e = P.e.HasValue ? P.e : ""; 
var f = P.f.HasValue ? P.f : ""; 
Console.WriteLine("{0},{1},{2}", d, e, f); 
3
public Person() 
     : this(0,0,0) 
    { 
    } 
    public Person(int a) 
     : this(a,0,0) 
    { 
    } 
    public Person(int a, int b) 
     : this(a,b,0) 
    { 
    } 
    public Person(int a, int b, int c) 
    { 
     d = a; e = b; f = c; 
    } 
+0

Никаких объяснений вообще? –

+0

Просто покажите, что такое ошибка. Автору приходится перегружать своих конструкторов. – Uzzy

+0

Автор уже перегружал конструкторы. Однако он не связывал одну перегрузку с другой.Я нахожу, что ответы только на код * очень редко используются так, как те, которые объясняют, что происходит. –

1

Вы можете написать эту

public Person(int a, int b) 
     : this(40, 6, 8) 
    { 
    } 

вызвать другой конструктор.

+0

Как в мире мой ответ принят, а не Джон Скит ?! КОНЕЦ БЛИЗОК! O_O – Shaamaan

+0

Ну, я думаю, сбалансированный был восстановлен ... Shaamaan

Смежные вопросы