2010-03-23 5 views
4

는, 다음 클래스 I 애플에 업 캐스팅 새로운 과일하지만 인스턴스를 어떻게어떻게 기본 클래스를 인스턴스화 한 다음 파생 클래스로 변환 할 수 있습니까? 나는이 작업을 수행하는 방법을 궁금

public class Fruit 
{ 
    public string Name { get; set; } 
    public Color Color { get; set; } 
} 
public class Apple : Fruit 
{ 
    public Apple() 
    { 

    } 
} 

을 고려, 과일의 무리를 인스턴스화하고 이름으로 그들에게 사과를 만들 수있는 방법이 & 색상 세트. 수동으로 딥 카피해야합니까? 물론

Fruit a = new Fruit(); 
a.Name = "FirstApple"; 
a.Color = Color.Red; 
Apple wa = a as Apple; 
System.Diagnostics.Debug.Print("Apple name: " + wa.Name); 

내가이 작업을 수행 할 수있는 더 나은 디자인이있는 AppleCTor에 과일을 전달하고 수동으로 이름과 색 (또는 1-n 개의 속성)을 설정해야합니까 실패?

+3

지구상에서 왜 이것을하고 싶습니까? – Welbog

+0

@welbog, prolly never to;) 디자인 상 결함을 보여 주며, 과일은 템플릿으로, 사과는 그것을 확장하고, 다른 사람들은 과일을 사용합니다. – Eric

답변

5

하는 FruitApple하지 않습니다 - 당신이 원하는 경우 Apple, 하나를 인스턴스화하십시오.Fruit을 시작 지점으로 사용하여 Apple을 만들려면 Fruit을 허용 할 수있는 Apple의 생성자를 만듭니다.

상속 계층 구조의 중간 클래스가 추상화가 아닌 인스턴스화 가능한 객체 모델은 종종 나쁜 생각입니다. 경우에 따라 그러한 계층 구조가 적절할 수도 있지만 일반적으로 가치가있는 것보다 더 문제가 있음을 발견했습니다. FruitApple이 구체적이고 구체화 될 필요가 있는지 정말 열심히 생각하십시오.

+0

나는 그것을 시도했다, 그것은 나에게 이것이 재 설계되어야한다고 말하는 것 같지 않았다. 공개 Apple (과일 과일) { base.Color = fruit.Color; // 기타 } – Eric

4

일반적인 기본 클래스에서 파생 된 여러 가능한 개체 중 하나를 인스턴스화하는 방법을 생각해 보는 것처럼 보입니다. 일반적으로 이것은 Abstract Factory 패턴을 통해 수행됩니다. 자세한 내용과 구현 예는 http://en.wikipedia.org/wiki/Abstract_factory_pattern

+0

이 답변에 어떤 문제가 있습니까? 나는 그것이 OP를위한 좋은 자료라고 생각했다. –

+0

링크 인 답변 만 싫증납니다. –

+0

그건 공정한 경찰이에요. 여기에 상대적으로 새로운, 사과. –

6

기본적으로 a 인스턴스는 Fruit의 인스턴스이며 Apple으로 변환 할 수 없습니다. 이 아니며이 아니며 Apple 인스턴스는 아닙니다.

그러나 explicit cast을 구현할 수 있습니다.

2

과일을 만드는 경우 Apple이 아닙니다. 아마 필요한 모든 속성을 가지고 있지 않기 때문에 업 캐스트 할 수 없습니다. Apple을 원하면 Apple을 만드십시오. 아무것도 전달할 필요가 없습니다.

Fruit a = new Apple(); 
System.Diagnostics.Debug.Print("Apple name: " + a.Name); 

을 ...하지만 난 자바 프로그래머가 아니에요 :

나는 다음이 작동합니다 생각한다. 그것은 기본적으로 C++에서 무엇을 할 것인가입니다. (당신은 과일의 다른 아형의 무리를 인스턴스화 할 필요 특히, 다른 답변에 주어진 추상 팩토리 패턴 링크를 읽어주십시오.) 모델에서

관련 문제