내 클래스에서 유효성을 검사하고 추적해야하는 전화 번호가 있고 대부분 전화 번호가 문자열이므로 말리려고하면 전화 클래스를 만들고 문자열을 상속합니다. 이후로 나는 최선의 접근 방법이 무엇인지 알 수 없기 때문에? 문자열을 전용 멤버로 추가하고 equal/= 연산자를 오버로드하여 전달하고 문자열로 설정할 수 있습니까?봉인 된 클래스에서 상속
답변
요하네스 루돌프 (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);
}
}
은 상속보다 합성을 선호합니다.
문자열에서 전화 번호를 할당 할 수 있도록 하시겠습니까? 물론 다음은 가능한 것 때문이이 같은
Person.PhoneNumber = "FOO"
뭔가 더 자연스러운 느낌 :
Person.PhoneNumber = new PhoneNumber("015-123456");
당신은 생성자에서 지정 유효성 검사를하고 additionaly 당신이 불변 할 결정할 수 있습니다 (OK 문자열도 변경되지 않습니다)
제안한대로 개인 문자열 멤버를 사용하여 PhoneNumber 클래스를 만듭니다. 일관된 형식 (예 : (123) 123-1234 또는 기타)을 제공하려는 경우 ToString() 메서드를 재정의 할 수 있습니다. 설정 메서드 나 생성자에 대한 유효성 검사를 추가하여 전화 번호가 10 자리 (if 북미 번호).
PhoneNumber 클래스를 생성하면 나중에 필요할 때 클래스를 확장 할 수 있습니다. 예를 들어 유효하지 않은 지역 번호를 확인하기 위해 전화 번호 검증을 강화하고 지역 번호가없는 경우 오류를 제기 할 수 있습니다.
간단히 말해서, 개인 회원이 있습니다. 그러나 할당 오버로드 대신 고정 구문 분석 멤버가 필요합니다.
PhoneNumber p = PhoneNumber.Parse("704 - 576- 4000");
이것은 더 표준적이고 더 읽기 쉽습니다. 또한 문자열을 상속 할 수있는 경우에도 String 클래스는 내부 클래스와 분리 된 복잡한 내부 기능을 가지고 있기 때문에 이에 대해 조언하고 싶습니다. 또한 문자열을 상속하면 전화 번호에 대해 이해할 수없는 여러 가지 메서드가 노출됩니다 (예 : Concat, 부정확 한 비교 등).
- 1. 상속 된 클래스에서 log4j 사용
- 2. DynamicObject에서 상속 한 클래스에서 상속
- 3. .NET에서 리플렉션을 사용하여 봉인 된 클래스에서 상속하는 방법은 무엇입니까?
- 4. 봉인 된 클래스에 IDisposable 구현
- 5. 봉인 된 부분 클래스
- 6. 봉인 된 이유는 무엇입니까?
- 7. COM 클래스에서 상속
- 8. EF의 MembershipUser 클래스에서 상속
- 9. 다형성 레일 연결이 상속 된 클래스에서 실패합니까?
- 10. C# 자체 내에서 중첩 된 클래스에서 상속
- 11. Array 클래스에서 상속 받음
- 12. C# : 봉인 된 클래스에서 모의 및 보호 된 (또는 개인) 메서드 - 접근 방식
- 13. 데코 레이팅 클래스에서 상속
- 14. - 클래스에서 메서드에서 메서드로 상속?
- 15. .Net의 Type 클래스에서 상속
- 16. 템플릿 클래스에서 상속
- 17. ListViewGroup이 봉인 된 이유는 무엇입니까?
- 18. 상속 된 보호 된 메서드
- 19. 클래스 또는 추상 클래스에서 상속
- 20. 상속 클래스에서 메서드를 호출하는 방법
- 21. UserControl 추상 하위 클래스에서 상속
- 22. 추상 클래스에서 정적 변수 상속
- 23. "내부 형식을 제외하고 봉인 된"형식을 만들 수 있습니까?
- 24. 속성을 상속하고 추가 할 때 봉인 된 클래스를 처리하는 방법
- 25. typecasting 연산자가 상속 된 클래스에서 작동하지 않는 이유는 무엇입니까?
- 26. VS2005의 C# : 상속 된 클래스에서 명시 적으로 슈퍼 생성자를 호출해야합니까?
- 27. 기본 클래스에서 상속 된 클래스로 캐스팅 할 때 InvalidCastException이 발생합니까?
- 28. 상속 된 클래스에서 생성자를 자동으로 만들기위한 Visual Studio 바로 가기
- 29. 상속 된 ControlDesigner 클래스에서 ITypeDescriptorContext 및 IServiceProvider를 구하는 방법
- 30. 어떻게 봉인 된 클래스에 Databind 할 수 있습니까?
나의 이해 Person.PhoneNumber = "FOO"을 복용하고 예외를 던지는 것이 더 좋은 연습이 있다는 것이다 다음 Person.PhoneNumber = 새로운 PHONENUMBER ("FOO"); 생성자에 대한 예외를 throw합니다. 하지만 이건 내 C++ 배경 울리는 벨일 수 있습니다. –
벨소리는 일반적으로 정확하지만 여기서는 GC 환경에서 작업하므로 실패한 개체 생성에는 아무런 문제가 없습니다. 또한 Person.PhoneNumber 생성자를 private으로 만들고 PhoneNumber 인스턴스를 만들고 문자열의 유효성을 검사하는 정적 PhoneNumber.Parse 메서드를 제공 할 수 있습니다. –