2009-04-06 6 views
1

클래스 디자인에 문제가 있습니다.다형성 문제 - 가상 필드? (C#)

내 게임 개체에 핵심 클래스가 있습니다. 그리는 동안 객체에서 위치를 가져와야합니다. 안타깝게도 객체는 기본 유형으로 간주되므로 파생 클래스에서 위치를 가져 오지 않지만 부모에서 가져온 위치는 가져옵니다. 가상으로 필드를 정의하는 것은 내 문제를 해결하지만, 나는이 문제를 방지하기 위해 클래스 스키마를 설계 할 수있는 방법에 무슨 일이 일어나고 있는지의

간단한 예를 :(불가능 다음과 같습니다.?

class BaseClass { public Vector2 position = new Vector2(){X=0,Y=0}; } 
class Class:BaseClass { public new Vector2 position = new Vector2(){X=10,Y=10}; } 

BaseClass c = new Class(); 
// c.position.X is now 0 
+0

왜 당신이 첫번째 장소에있는 기본 클래스 필드를 숨기고 :

양자 택일로, 당신은 기본 클래스가 위치를 처리하고 단지 초기 값을 전달하도록 할 수 있습니다? –

답변

3

당신은 사용이 재 작업 할 수 있습니다 . 대신 필드의 가상 속성이 제대로 일을 처리 할

을 속성을 다음과 같이, 당신은 또한 당신의 생성자를 재 작업 할 수 있습니다 어떤 이유에서 가능성이없는 경우 :.

class BaseClass 
{ 
    public Vector2 position = new Vector2(){X=0,Y=0}; 
} 

class Class:BaseClass 
{ 
    public Class() 
    { 
     this.position = new Vector2(){X=10,Y=10}; 
    } 
} 

기본 클래스 필드를 직접 숨기지 않으므로 정확하게 동일하지는 않지만 예제에서 제시하는대로 사용할 수 있도록 올바르게 초기화합니다.

1
  • new 키워드는 기본 클래스에 정의 된 동일한 이름의 기호를 숨기도록 지정합니다.
  • public 필드는 C#에서 "냄새"로 간주됩니다

해결 방법 : 사용 특성 및 override 파생 클래스에서 속성 :

class BaseClass { 
    public virtual Vector2 Position { 
     get { return new Vector2(){X=0,Y=0}; } 
    } 
} 

class Class : BaseClass { 
    public override Vector2 Position { 
     get { return new Vector2(){X=10,Y=10}; } 
    } 
} 

당신은의 인스턴스를 저장하는 백업 필드를 사용할 수 있습니다 Vector2.

class BaseClass { 
    private Vector2 _position; 
    public BaseClass() { 
     _position = new Vector2(){X=0,Y=0}; 
    } 
    protected BaseClass(Vector2 initialPosition) { 
     _position = initialPosition; 
    } 
    public Vector2 Position { 
     get { return _position; } 
     set { _position = value; } 
    } 
} 

class Class : BaseClass { 
    public Class() : base(new Vector2(){X=10,Y=10}) { 
    } 
} 
+0

공공 분야를 "냄새"라고 생각하는 이유는 무엇입니까? – d347hm4n