2014-03-02 3 views
1

제목이 다소 비 효과적 일 수 있지만 가능한 한 명확하게 설명하려고합니다. 나는 다른 누군가가 만든 수업에서 상속받을 수업을 만들었습니다. 나는 최종 사용자가 여전히 그에게 방법 및 필드에 대한 액세스를 허용하면서 사용하는 어떤 모양을 제어 할 수 있도록 어떻게인터페이스를 필드 유형으로 사용하지만 기본 클래스에서 파생 된 구조체를 선택하십시오.

IShape Bounds = new Rectangle(/*arguments go here*/); 

: 내 클래스는 지금처럼 내가 만든 IShape 인터페이스를 사용하여 형상 구조체 변수를 포함 선택한 모양 (24/7 언 박싱없이)? 기본적으로 사용자가 원하는 모양을 선택하길 원하지만 여전히 충돌 모양과 같은 항목을 수행 할 수있는 모양을 IShape 형식으로 유지해야합니다. 예 :

Bounds = new Triangle(/*arguments*/); 
Bounds.Point3 = new Point(20f, 20f); //this property would be from the Triangle : IShape struct only and is not inherited from IShape 

최종 사용자가 쉽게 사용할 수있는 방법이 있습니까?

+2

제네릭을 사용해 볼 수 있습니다. – MarcinJuraszek

답변

1

하나의 가능한 솔루션은 인터페이스 제약 조건이있는 일반 클래스를 사용하는 것입니다.

public class MyClass 
{ 
    private IShape Bounds; 

    protected TShape GetBounds<TShape>() where TShape : IShape 
    { 
     return (TShape)Bounds; //Note this will throw an exception if the wrong shape is specified 
    } 
    //Rest of class 
} 

는 전자는 경우에 더 적합 : 또는

public class MyClass<TShape> where TShape : IShape 
{ 
    protected TShape Bounds; 
    //Rest of class 
} 

, 당신은 캐스팅이 완료되는 경우 중앙 집중화 것이 일반적인 방법을 통해 모양에 대한 액세스를 제공 할 수있다 : 같은 선언은 보일 것이다 기본 클래스는 자체 모양 유형을 아는 책임을 져야합니다. 후자는 상속 클래스 (또는 공개 클래스를 호출하는 경우 호출 클래스)가 알아야하는 동안 기본 클래스가 모양 유형을 모르는 채로 남아 있어야하는 경우에 더 적합합니다.

그러나 이러한 솔루션 중 하나가 상황에 잘 맞을 수도 있지만 전혀하지 않아도되는 코드 냄새가 있습니다. 클래스가 특정 구체 클래스를 대부분 알아야하고 추적해야하는 경우 인터페이스를 사용하는 것이 중요하지 않습니다. 가장 좋은 해결책은 디자인을 변경하는 것일 수 있습니다. 그러나 당신이 가진 것을 더 많이 보지 않고 조언을하는 것은 어렵습니다.

+0

의견에 감사드립니다. 내가 골라야한다면 두 번째 옵션으로 갈 것입니다. 나는 어떤 모양 (즉, IShape 인터페이스)을 취할 수있는 충돌 시스템을 구현했기 때문에이 디자인에왔다. https://github.com/Villermen/HatlessEngine/blob/master/PhysicalObject.cs는 BoundBox가 여전히 직사각형 인 객체의 위치입니다. 나는 그것을 IShape 또는 유사한 시스템으로 변경하고 싶다. 당신이 그것을 borky 코드로 보았 기 때문에 다르게 할 수있는 조언이 있습니까? – Villermen

+0

@Villermen 글쎄, 왜 이런 형식을 언제든지 정확하게 입력 할 수있는 이유가 확실하지 않습니다. - 바운딩 쉐이프가 변경되지 않도록하십시오. - 바운딩 쉐이프를 기존의 바운딩 쉐이프를 수정하지 않고 새 것으로 바꿀 수 있습니다. - 첫 번째 위치의 모양을 설정하는 외부 코드는 무엇이든 유지합니다. 정확히 필요한만큼 정확한 타입에 의한 참조 - 모양 서브 타입을 전혀 가지지 말라. Shape은 어떤 길이의 포인트 목록을 가져라. (> 2) –

+0

사용자가 실제로 그것을 어떻게 할 것인지 생각한 후에 당신의 첫 번째 옵션에갔습니다. 사용자는 바운드 모양을 설정할 수 있습니다. 그런 다음 회전 할 수는 있지만 액세스 할 수있는 유일한 방법은 없지만 아마도 그 해결 방법을 만들 수 있습니다. 따라서 모든 사용자는 새로운 모양을 할당 할 수 있어야합니다. 예를 들어 변경하려는 경우 셰이프의 너비 또는 회전은 사각형 일 경우 단순히 모양을 그립니다. 도와 줘서 고마워! – Villermen

관련 문제