런타임에서 (런타임 중에) 함수에서 반환 할 유형을 어떻게 결정할 수 있습니까?
전혀 가능합니까?
나는 그것이 하나라고 확신 할 수 없다고 생각합니다.다른 유형의 반환
답변
사용 다형성
public interface MyType {
public void doSomething();
}
public class A implements MyType {
public void doSomething(){}
}
public class B implements MyType {
public void doSomething(){}
}
public class MyClass {
public MyType getData(){
if (/* some condition */){ return new A(); }
return new B();
}
public void test(){
MyType o = this.getData();
o.doSomething();
}
}
단순히 유형 MyType
의 반환하고 그 객체에 직접 doSomething()
전화; 즉, 반환 된 유형이 A
또는 B
인지 여부를 알 필요가 없습니다. 당신이 신경 쓰는 것은 그것이 doSomething
을 구현한다는 것입니다. 부스트를 사용하는 옵션 인 경우 즉, 다형성의 아름다움, 즉 더 이상 추한 is
, getType
, instanceOf
(자바) 등
잘못된, 그것은 C에 대한 자바 대답에게있어 ++ 질문, 정말 대답 템플릿 OP에 적용 할 수없는 대안에 대한 제안. 태그를보십시오. –
이 예제는 Java이며 질문은 C++에 관한 것입니다. C++에서 기본적으로 동일한 작업을 수행 할 수 있습니다. 사용자 정의 유형 만 신경 쓰면됩니다. C++에서 할 수없는 일은 C++이 모든 클래스를 공통 루트 유형에서 상속하도록 자동으로 강제하지 않기 때문에'Object'를 반환하는 것입니다. – bames53
@Jacobo 당신은 진지한가 ??? C++, C#, Java, PHP 등의 언어가 무엇이든 상관하지 않습니다. – scibuff
입니다 Boost.Variant을 사용하는 것이 좋습니다.
변종을 union
으로 스테로이드로 생각할 수 있습니다. 대부분의 C++ 유형과 호환되며 컴파일 타임 및 런타임 다형성을 모두 허용하지만 유형에 공통 기본 클래스가 필요하지 않습니다. 주요 단점은 심각한 양의 템플릿 메타 프로그래밍을 포함하므로 컴파일러에 약간의 부하가 걸릴 것이라는 점입니다. ,
typedef boost::variant<float, std::string> MyVariant;
MyVariant GetInt() { return MyVariant(42); }
MyVariant GetString() { return MyVariant("foo"); }
MyVariant v;
//run-time polymorphism:
int number = boost::get<int>(v); // this line may throw (basically a dynamic_cast)
//compile time polymorphism:
boost::apply_visitor(Visitor(), v);
// where Visitor is a functor overloading operator() for *all* types in the variant
더 경량 대안 Boost.Any있는 비교를 위해 this page를 참조하십시오
여기에 아이디어를 얻을 수있는 간단한 예입니다.
Boost.Any는 형식 지우기가 포함되어 있으므로 훨씬 더 많은 중량이 필요합니다. 그러나 Boost.Variant를 권유 한 +1. – ildjarn
가벼운 무게는 아마도 나쁜 단어였습니다. 제가 말하고자하는 것은 Any가 Variant보다 배우고 사용하기가 더 쉽다는 것입니다. 혼란을 드려 죄송합니다. – ComicSansMS
- 1. Java에서 다른 반환 유형의 오버로드가 발생 했습니까?
- 2. 지정되지 않은 유형의 일반 반환
- 3. void 유형의 반환 값 표시
- 4. 함수에서 모든 유형의 객체 반환
- 5. Java에서 반환 유형의 주석을 가져옵니다.
- 6. 1 유형의 객체를 다른 유형의 객체로 전송
- 7. 다른 반환 유형의 함수를 허용하면서 방문자 패턴 구현
- 8. 일반을 추가하면 다른 반환 유형의 메소드를 재정의 할 수 있습니까?
- 9. 한 유형의 벡터를 다른 유형의 벡터에 지정
- 10. 함수 반환 유형의 실존 정량화 시뮬레이션
- 11. List <> 유형의 속성 반환
- 12. Sobi2의 다른 유형의 목록
- 13. 다른 유형의 MongoDB 노드
- 14. 다른 유형의 DB에 연결
- 15. 다른 유형의 메소드 인수
- 16. 다른 유형의 기능 차이점
- 17. 다른 유형의 arraylist 변환
- 18. 다른 사용자 유형의 Drupal
- 19. 다른 유형의 배열
- 20. Memcached 다른 유형의 캐시
- 21. 다른 유형의 WAMP?
- 22. 선택적 평평 다른 유형의
- 23. 다른 유형의 구조체
- 24. 다른 유형의 웹 서비스
- 25. Solr : x 유형의 쿼리 및 반환
- 26. 반환 유형의 유형 한정자가 의미없는 이유는 무엇입니까?
- 27. 반환 유형의 유추 된 와일드 카드 제네릭
- 28. 쿼리 프로젝션에서 Linq2EF 반환 유형의 자식 클래스
- 29. 다른 유형의 콘텐츠에 대해 다른 부분 형식
- 30. 다른 데이터베이스 복제 (다른 유형의 RDBMS 간)
은 다형성 (polymorphism)을 사용한다. (물론 이것은 사용자 정의 된 타입에서만 작동 할 것입니다.) 대신에 객체 타입을 반환하도록 메소드를 선언 할 수는 있지만 매우 우아하지는 않습니다. – scibuff
일부 제한된 경우에, '노동 조합 '(무언가를 제공하는 것이 그것을 차별 함). 일반적으로 다형성이 좋습니다. –
@scibuff : 답변으로 게시해야합니다. –