2012-04-22 3 views
1

저는 C#을 연구하고 오버로드 된 생성자를 이해하려고합니다. 어떻게 작동하며 체인 호출과 같은 점을 사용합니까? 왜 모든 필요한 매개 변수를 가진 단 하나의 생성자 만 가지고 있지 않습니까? 아래에는 필자가 작업하고있는 작업에 도움이되는 코드가 있습니다.이 모든 생성자를 통해 요점을 이해하려면 도움이 필요합니다. 일부 도움을 preciate! 감사! 생성자 단지 지정 필드 것보다 더 많은 일을 할 수있는 계정의오버로드 된 생성자를 이해해야합니다.

public Email(string workMail) 
{ 
    m_work = workMail; 
    m_personal = string.Empty; 
} 

public Email(string workMail, string personalMail) 
{ 
    m_work = workMail; 
    m_personal = personalMail; 
} 

테이크 :

public class Email 
{ 
    //private email 
    private string m_personal; 
    //work mail 
    private string m_work; 

    public Email() 
    { 
    } 

    public Email(string workMail) : this(workMail, string.Empty) 
    { 
    } 

    public Email(string workMail, string personalMail) 
    { 
     m_work = workMail; 
     m_personal = personalMail; 
    } 

    public string Personal 
    { 
     //private mail 
     get { return m_personal; } 

     set { m_personal = value; } 
    } 

    public string Work 
    { 
     get { return m_work; } 

     set { m_work = value; } 
    } 

    public string GetToStringItemsHeadings 
    { 
     get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); } 
    } 

    public override string ToString() 
    { 
     string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal); 
     return strOut; 
    } 


} 

답변

3

필요한 모든 매개 변수가있는 생성자가 하나만있는 이유는 무엇입니까?

사용자가 일부 매개 변수에만 관심이 있다면? 예를 사용하여 누군가 개인 이메일을 가지고 있지 않은 경우에는 어떻게해야합니까? 그들은 null 또는 string.Empty을 전달해야합니까? 이러한 종류의 지식은 유형 자체에서 가장 잘 처리됩니다.

업무용 전자 메일로만 추가 생성자를 노출하면 기본적으로 클래스 소비자에게 말합니다. "개인 이메일을 가지고 있지 않으므로 걱정하지 마십시오, 처리 할 것입니다".

체인 연결 정의는 자연스럽게 코드 중복을 방지하는 데 도움이됩니다.

1

점은이를 방지하는 데 도움이되므로, 반복되는 코드를 방지하는 것입니다.

어떻게 작동합니까? 시도해보고 디버깅하고 배울 수 있습니다. 확실하지는 않지만 먼저 오버로드 된 코드를 호출하고 생성자의 코드를 호출 할 것이라고 생각합니다. 시나리오에서 전자 메일 (string workMail)을 호출하면 첫 번째 전자 메일 (string workMail, string personalMail)이 호출됩니다.

1

클래스 w의 경우 쉽게 승 여기에는 개인 메일 주소가 없습니다. 그런 다음 클래스 사용자는 작업 주소를 지정하기 만하면되며 클래스 자체는 해당 필드에 적절한 기본값을 설정하여 존재하지 않는 개인 주소 처리를 담당합니다. 해당 매개 변수가 누락 된 경우, 클래스의 사용자는 누락 된 개인 메일 주소에 대해 string.Empty를 채우기 위해 resposible이됩니다.

생성자는 코드 생성을 피하기 위해 다른 생성자에 대한 호출로 구현됩니다. 또한

public Email(string workMail) 
{ 
    m_work = workMail; 
    m_personal = string.Empty; 
} 

처럼 쓸 수 있지만, 그것은 "자신을 반복하지 마십시오"원칙을 따르기 때문에 두 매개 변수의 생성자를 호출하는 기존의 구현은 청소기 솔루션입니다.

2

이것은 약 Constructors이 아닙니다. 모든 종류의 오버로드 된 함수는 라이브러리 사용을 단순화합니다.우리가 클래스를 코딩 할 때, 우리는 모든 복잡성을 블랙 박스에 캡슐화 할 것이고 이것은 어떤 것으로 알려져 있습니다. best Practices. 좋은 예제는 쉽게 사용할 수있는 .NET 라이브러리입니다 (이러한 오버로드 된 함수/생성자를 기억하십시오).

우리는 오버로드 된 함수를 사용하여 사용법을 단순화하므로 필요하지 않을 때 null 매개 변수를 전달할 필요가 없습니다.

두 번째로 매개 변수가 작은 다음 함수로 중첩 된 대부분의 매개 변수가있는 함수를 Redundancy으로 줄입니다. 나는 모든 버전의 기능에서 동일한 코드를 복사/붙이기를 피하는 것을 의미한다.

패턴이 광범위하게 받아 들여지고 사용되기 때문에 차세대 .NET은이 중복 버전을 어떤 식 으로든 숨기고 대부분의 매개 변수로 함수를 코딩합니다.

관련 문제