2009-10-14 6 views
1

내 클래스에서 유효성을 검사하고 추적해야하는 전화 번호가 있고 대부분 전화 번호가 문자열이므로 말리려고하면 전화 클래스를 만들고 문자열을 상속합니다. 이후로 나는 최선의 접근 방법이 무엇인지 알 수 없기 때문에? 문자열을 전용 멤버로 추가하고 equal/= 연산자를 오버로드하여 전달하고 문자열로 설정할 수 있습니까?봉인 된 클래스에서 상속

답변

1

요하네스 루돌프 (Johannes Rudolph) 또는 로스 (C.Ross)의 조언을 듣기를 권장합니다. implicit 키워드의 동작을 검토하면 유효성 검사를하면서 문자열 형식으로 할당 할 수 있습니다.

즉 :

public class PhoneNumber { 

    private String number; 

    public PhoneNumber(String s) { 
     // validation code here, throw exception if not valid 
     number = s; 
    } 

    public static implicit operator PhoneNumber(String s) { 
     return new PhoneNumber(s); 
    } 
} 
7

은 상속보다 합성을 선호합니다.

문자열에서 전화 번호를 할당 할 수 있도록 하시겠습니까? 물론 다음은 가능한 것 때문이이 같은

Person.PhoneNumber = "FOO" 

뭔가 더 자연스러운 느낌 :

Person.PhoneNumber = new PhoneNumber("015-123456"); 

당신은 생성자에서 지정 유효성 검사를하고 additionaly 당신이 불변 할 결정할 수 있습니다 (OK 문자열도 변경되지 않습니다)

+0

나의 이해 Person.PhoneNumber = "FOO"을 복용하고 예외를 던지는 것이 더 좋은 연습이 있다는 것이다 다음 Person.PhoneNumber = 새로운 PHONENUMBER ("FOO"); 생성자에 대한 예외를 throw합니다. 하지만 이건 내 C++ 배경 울리는 벨일 수 있습니다. –

+0

벨소리는 일반적으로 정확하지만 여기서는 GC 환경에서 작업하므로 실패한 개체 생성에는 아무런 문제가 없습니다. 또한 Person.PhoneNumber 생성자를 private으로 만들고 PhoneNumber 인스턴스를 만들고 문자열의 유효성을 검사하는 정적 PhoneNumber.Parse 메서드를 제공 할 수 있습니다. –

1

제안한대로 개인 문자열 멤버를 사용하여 PhoneNumber 클래스를 만듭니다. 일관된 형식 (예 : (123) 123-1234 또는 기타)을 제공하려는 경우 ToString() 메서드를 재정의 할 수 있습니다. 설정 메서드 나 생성자에 대한 유효성 검사를 추가하여 전화 번호가 10 자리 (if 북미 번호).

PhoneNumber 클래스를 생성하면 나중에 필요할 때 클래스를 확장 할 수 있습니다. 예를 들어 유효하지 않은 지역 번호를 확인하기 위해 전화 번호 검증을 강화하고 지역 번호가없는 경우 오류를 제기 할 수 있습니다.

2

간단히 말해서, 개인 회원이 있습니다. 그러나 할당 오버로드 대신 고정 구문 분석 멤버가 필요합니다.

PhoneNumber p = PhoneNumber.Parse("704 - 576- 4000"); 

이것은 더 표준적이고 더 읽기 쉽습니다. 또한 문자열을 상속 할 수있는 경우에도 String 클래스는 내부 클래스와 분리 된 복잡한 내부 기능을 가지고 있기 때문에 이에 대해 조언하고 싶습니다. 또한 문자열을 상속하면 전화 번호에 대해 이해할 수없는 여러 가지 메서드가 노출됩니다 (예 : Concat, 부정확 한 비교 등).

관련 문제