2009-03-16 4 views
1

User 클래스로부터 상속 된 SalesMan 클래스를 가지고 있으며 ISalesMan 인터페이스도 구현합니다.상속 및 변환 객체

public class SalesMan : User, ISalesMan 
{ 
... 
} 

나는 SalesMan 객체로 User 객체를 변환해야합니다. 직접 주조가 User 유형의 물체로 SalesMan 유형으로 들어갈 수 없음을 이해합니다. 전환을 어떻게해야합니까? 주어진 User을 기반으로 새 SalesMan 객체를 User 매개 변수를 초기화합니다 SalesMan 클래스의 생성자를 만들기

  1. : 나는 두 가지 방법을 생각하고있다.

  2. 주어진 User 매개 변수를 기반으로 새 SalesMan 객체를 매개 변수로 User를 받아 반환 SalesMan 클래스에 대한 새로운 방법을 만들기.

... 이런 종류의 문제를 해결할 수있는 더 똑똑한 방법이 있습니까?

답변

4

옵션 1에 설명 된 생성자는 익숙하지 않은 API를 파고 들었을 때 기대했던 것입니다.

그들은 쓸데없는 짐승이 될 수 있습니다. 사용자 클래스에 새 필드를 추가 할 때 업데이트하는 것을 잊어 버릴 수도 있습니다. 따라서 (성능 고려 사항이 허용하는 경우) 리플렉션을 사용하여 "지능형"생성자를 작성하는 것을 고려하십시오 (along the lines of this example). 그들은 일반적으로 더 사용할 수있는 일관 하고 편리한 후 전문 이기 때문에

  • 이 공장에 생성자를 선호합니까 : 팩토리 메소드 대 생성자의 문제에

    Framework Design Guidelines는 다음과 같은 조언을 제공합니다 구조 메커니즘.

  • 보다 더 많은 제어가 필요한 경우 생성자가 인스턴스 생성을 통해 제공되는 것보다 낫습니다.

  • 은 이러한 기본 유형 또는 인터페이스에 대해
    을 코딩하는 경우와 같이 개발자가 유형
    구조를 알고하지 않을 수 있습니다 공장을 사용합니까.

  • 명명 된 방법이있는 경우에만 작업을 수행하는 유일한 방법입니다. 자체 설명이 필요합니다.

+0

이 기사에서 설명한 "지능형"복사본 생성자는 값 형식 필드에만 사용할 수 있습니다. 또한 이와 같이 많은 인스턴스를 생성해야하는 경우 Reflection이 너무 느릴 수 있습니다. –

+0

옵션 1을 복사 생성자라고 부르지 않을 것입니다. 이들은 대개 다음과 같은 형식을 취합니다. MyClass (MyClass o) 이것은 C++에서 변환 생성자로 불립니다. –

+0

@Seb Rose 당신이 올바르게 편집되었습니다. –

0

옵션 1은 가장 단순하고 직관적입니다.

0

당신이 정말로 당신이 일하는 것이 설명하는 옵션 중 하나를 사용자 개체에서 세일즈맨 개체를 만들려면.

하지만 나는 당신이하고 싶은 일을 스스로 생각해 봐야한다고 생각합니다. 사용자가 언제/왜 SalesMan이 되는가? 기존 객체의 바하 이어를 변경하려고합니까? 시스템에서 동작이 정기적으로 변경됩니까?

필요에 따라 전략 또는 템플릿 방법 패턴을 사용할 수 있습니다.

0

옵션 1. 업그레이드 생성자 또는 변환 생성자를 사용합니다.

0

이미받은 답변이 충분합니다. 그러나 캐스팅을 할 수 없다고 언급했습니다. 캐스트를 사용해야하는 이유가 있다면 연산자를 과부하하여이 가능할 수 있습니다.

public static explicit operator SalesMan(User user) 
{ 
    // Your logic to create a new SalesMan using data from user. 
} 

스마트 원래 게시물에 제공된보다 더 많은 정보를 요구되는 솔루션 결정. 그러나 나는 완성도와 다양성의 측면에서 방송하는 경향이 있으며, 둘 다 수행하는 것을 고려할 것입니다.

이안의 권리. 일반적으로 어림짐작은 생성자를 만날 수없는 기능적 요구 사항이 있거나 해당 언어의 제약 조건이 발생하기 시작하는 경우에만 팩터 리를 사용하는 것입니다. 예를 들어, 동일한 서명으로 두 개의 다른 생성자가 필요합니다.