2011-08-12 3 views
3

설정 나는이 수업이 있습니다C#을 생성자 두 번째 속성

public class CalendarData_Day 
{ 
    public DateTime Date { get; set; } 
    public DayType TypeOfDay { get; set; } 
    public bool Choose { get; set; } 

    public CalendarData_Day(DateTime datum) : this(datum, DayType.Normal, true) 
    { 
    } 

    public CalendarData_Day(DateTime datum, DayType typDne) : this(datum, typDne, true) 
    { 
    } 

    public CalendarData_Day(DateTime datum, DayType typDne, bool vybran) 
    { 
     this.Date = datum; 
     this.TypeOfDay = typDne; 
     this.Choose = vybran; 
    } 
} 

및 DayType은 주말이면 나는 두 번째 생성자 체크에서 원하는하고 있는지 다음 사실이지만 잘못된 선택을 보낼 수 없습니다. 아무도 내가 어떻게 할 수 있는지 몰라? 만약 내가 마지막 생성자에 추가 할 수 있다는 것을 알았지 만 확인해 보았지만 나에게 맞는 것 같지 않습니다.

if (TypeOfDay == DayType.Weekend) 
    this.Choose = false; 

내가 키우면 작동 알고 있지만 나는 그것이 올바른 방법을 알고하지는 : 나는 내가 그것을 다른 방법을하거나 마지막 생성자에 괜찮 이것입니다해야한다고 생각 더 좋은 방법이 있다고 생각합니다.

편집 : 모든 것을 설명하지 않아서 미안합니다. 거기에 2 DayTypes, 휴일, 직장, 말할 수 있습니다 ... 그리고 그 사용자가 단지 두 번째 생성자와 클래스를 호출 할 수 있고 주간 또는 휴일 주일 또는 휴일있을 경우 다음 false 선택해야합니다 있지만 정상 또는 작업이 사실이거나 사용자가 마지막으로 컨스트럭터를 사용해야하고 DayType을 Work로 설정하고 false로 선택해야합니다. 그것은 처음으로이 책을 쓴다면 유감 스럽다.

답변

7
매개 변수에 따라 체인 생성자 인수를 전달하는 데 더 좋은 것

:

public CalendarData_Day(DateTime datum, DayType typDne) 
    : this(datum, typDne, typeDne != DayType.Weekend) 
{   
} 

두 번 속성을 설정할 필요가 없습니다 그 방법 - 한 번 기본 값의 종류에 다음 그것을 해결을 이미 알고있는 정보를 바탕으로

개인적으로 매개 변수 이름을 typDne에서 dayType 또는 이와 비슷한 것으로 변경합니다.

편집 : 난 단지 당신이 하나가 아닌 마지막 생성자에 테스트를 가하고 고려 있다고 보았다. 조건부로 무시하는 대신 vybran에 대한 발신자가받은 값을있는 그대로 받아 들여야합니다. 은 두 번째 생성자가 마지막 생성자가 아닌 DayType == Weekend을 확인하기를 원하므로을 설명합니다. 따라서 두 번째 생성자 만 변경해야합니다.

편집 : 당신은 매우있는 경우

public CalendarData_Day(DateTime datum, DayType typDne) 
    : this(datum, typDne, 
      typeDne != DayType.Weekend && typeDne != DayType.Holiday) 
{   
} 

public CalendarData_Day(DateTime datum, DayType typDne, bool vybran) 
{ 
    if (vybran && (typeDne == DayType.Weekend || typeDne == DayType.Holiday)) 
    { 
     throw new ArgumentException(
      "vybran cannot be true for holiday or weekend dates", "vybran"); 
    } 
    this.Date = datum; 
    this.TypeOfDay = typDne; 
    this.Choose = vybran; 
} 
+0

당신의 솔루션을 좋아하지만 유감스럽게도 단지 DayType.Weekend와 Normal이 아니라는 것을 잊어서 죄송합니다. 더 많은 유형이 될 수 있으므로 마지막 생성자에서 속성을 두 번 설정해야한다고 생각합니다. –

+0

@ 비보 : 왜? 내 메소드는 당신이 묘사 한 것을 정확히 수행한다. 선택은'typeDne'이 Weekend이고 거짓이면 그렇지 않다. 그리고 다시, 마지막 생성자를 직접 호출했을 때 사용자가 넘겨 준 것을 오버라이드하고 싶은가? 그 * 정말 * 당신의 의도, 그것을 명확하게 질문을 편집하십시오. 사용자가 * 직접 * 새로운 CalendarData_Day (날짜, DayType.Weekend, true)를 호출하면 어떻게 될지 생각하십시오. –

+0

주말은 항상 거짓이되어야하지만 어떤 경우에는 혼란 스러울 수 있으므로 내 게시물을 편집합니다. –

4

생성자의 매개 변수를 확인하는 것은 완벽합니다.

당신은 조건이 거짓 인 경우 예상대로 코드가 여전히 작동하는지 확인해야하지만

:

if (TypeOfDay == DayType.Weekend) 
{ 
    this.Choose = false; 
} 
else 
{ 
    this.Choose = vybran; 
} 

당신이 던지는 고려할 수있는 ArgumentException에 전달 된 매개 변수가 완전히 잘못이 있다면.

+1

는 일반적으로, 나는 조건부 또는 정답을 줄 것이다 다른 표현을 사용합니다. 이 경우 :'this.Choose = TypeOfDay! = DayType.Weekend;'. 비교를보다 명확하게하려면 괄호를 사용하십시오. –

+0

@ 존 - 테스트가 실패 할 경우 실제 전달 된 값을 원한다면 동의하지 않습니다. 귀하의 버전과 광산은 다른 일을합니다. – Oded

+0

@Downvoter - 댓글을 올리시겠습니까? – Oded

0

: Choose 주말 또는 휴일에 대해 false해야한다면 나는 하지만 마지막 생성자의 두 번째 생성자에서 을 선택하는 것이을 적용 할 것 생성자 중 하나에서 광범위한 로직을 사용하면 개인 생성자를 호출하는 정적 생성 함수의 이점을 누릴 수 있습니다.내가 볼 때 모든 것을 두 개의 몸에 변화 어디에하면 같은 방법으로 사용되는 값은 "만일"

class MyClass 
{ 
    private MyClass(...) 
    { 

    } 
    public static MyClass CreateMyClassWithValidation(...) 
    { 
    if(....) 
     return new MyClass(...); 
    } 
}