2012-02-08 3 views
0

여러 생성자가있는 경우 다른 생성자를 호출하는 장점은 무엇입니까? 감사합니다.다른 생성자를 하나씩 호출하는 경우

+3

음, 다른 *에서 * 메소드 *를 호출하면 어떤 이점이 있습니까? 생성자는 new 연산자의 결과가 생성되기 전에 호출되는 * 메소드 * 일뿐입니다. –

답변

6

같은 장점은 당신이 얻을 : 당신이 기본 생성자에 기본값을 전달하려는 경우 동일한 코드

public class Person 
{ 
    public Person(string name,string lastName) 
    { 
     Name = name; 
     LastName = lastName; 
    } 

    public Person(string name, string lastName,string address):this(name,lastName) 
    { 
     //you don't need to set again Name and Last Name 
     //as you can call the other constructor that does the job 
     Address = Address; 
    } 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
} 
8

자신을 반복하지 마십시오.

하나의 생성자 구현 변경은 다른 모든 생성자에도 즉시 영향을 미칩니다. 코드 복사 및 붙여 넣기가 좋지 않으므로 피해야합니다. 이 방법은 오버로드를 수행 할 때

+0

관련 : http://stackoverflow.com/questions/2490884/why-is-copy-and-paste-of-code-dangerous/2490897#2490897 – Oded

1

를 반복하지 않습니다.

public class YourClass 
{ 
    private int SomeInt; 

    public YourClass() : this(0) 
    { 
     // other possible logic 
    } 

    public YourClass(int SomeNumber) 
    { 
     SomeInt = SomeNumber; 
    } 
} 

이는 DRY 원칙을 다음과 (자신에게를 반복하지 마십시오). 간단한 예이지만 생각을 설명해야합니다.

1

기본 또는 null 값을 다른 생성자에 전달할 때 사용했습니다. 위의 경우 사용자는 생성자를 호출 할 때 null을 전달할 필요가 없습니다. 아무 것도하지 않고 호출 할 수 있습니다.

public class Widget(){ 

    public Widget() : this(null){ 

    } 

    public Widget(IRepository rep){ 
     this.repository = rep; 
    } 
} 
3

이미 게시 된 답변을 보면 난 것이다 당신 항상 아래로 대부분의 전문 생성자에 기본 생성자에서 길을 걷는 사람들. 주변에 항상 동일한에게 다른 방법을 시도하는 것은 코드의 중복이나 문제에 이르게 :

좋은 방법 :

public class Foo() 
{ 
    public Foo() 
     : this(String.Empty) 
    { } 

    public Foo(string lastName) 
     : this(lastName, String.Empty) 
    { } 

    public Foo(string lastName, string firstName) 
     : this(lastName, firstName, 0) 
    { } 

    public Foo(string lastName, string firstName, int age) 
    { 
     LastName = lastName; 
     FirstName = firstName; 
     Age = age; 
     _SomeInternalState = new InternalState(); 
    } 
} 

나쁜 방법 :

public class Foo() 
{ 
    public Foo(string lastName, string firstName, int age) 
     : this(lastName, firstName) 
    { 
     Age = age; 
    } 

    public Foo(string lastName, string firstName) 
     : this(lastName) 
    { 
     FirstName = firstName; 
    } 

    public Foo(string lastName) 
     : this() 
    { 
     LastName = lastName; 
    } 

    public Foo() 
    { 
     _SomeInternalState = new InternalState(); 
    } 
} 

의 문제 두 번째 예제는 모든 매개 변수로 수행해야 할 부분이 이제는 모든 생성자에 대해 혼란스럽고 대신 하나의 (가장 특수화 된) 구현 된 것입니다. 이 클래스에서 파생되기를 원한다고 상상해보십시오. 두 번째 예제에서는 모든 생성자를 재정의해야합니다. 첫 번째 예제에서는 모든 생성자를 완전히 제어 할 수 있도록 가장 특수화 된 생성자를 재정의해야합니다.

+0

저는이 예제의 팬이 아닙니다. 다른 방향으로 캐스케이드해야합니다. 가장 높은 인수 수에서 – Kyle

+2

까지 @Kyle : NNNOOOOOOOO. 당신이 제안한대로하는 것은 문제를 일으 킵니다. 내 업데이트 답변을 참조하십시오. – Oliver

+1

무시 무시한 좋은 점 – Kyle

관련 문제