2011-12-26 2 views
2

Shape 클래스에서 ToString() 메서드를 상속하지 않고 상속 된 클래스에서 상속하지 않고 ToString() 메서드를 재정의하는 방법이 있습니까? 그래서 문자열 메쏘드에 어떤 모양이라도 호출 할 때마다 나는 오버라이드 된 것을 얻습니다. Shpae1 : :이하지 않으려는ToString()을 재정의합니다.

주 모양 재정 ....

내가이 일을 wan't 이유, 나는 이미 내 프로젝트에 모양을 많이 가지고있다 타원, 직사각형 등 (일반적인 것들). 나는 각 도형의 위치를 ​​인쇄하고 싶다. 나는 arg로서 모양을 취하는 별도의 함수를 사용할 수 있음을 알았지 만, 이미 도형의 문자열을 사용하는 몇 가지 코드가 있으므로 좀더 우아 할 것이라고 생각했다. 나는 toString 메서드를 변경하여 코드를 변경하지 않아도됩니다.

+0

자세한 정보를 제공해 주시겠습니까? Shape.ToString()을 Shape에서 상속하지 않고 사용 하시겠습니까? 그렇다면 왜? –

+0

OP 질문에 WPF 관련 문제가 없습니다. 지금 뭐야? –

+0

@PetarRepac : 아니요. OP는 그것을 말하지 않았다. – SLaks

답변

2

Shape 같은 기존의 클래스를 확장하는

주요 방법 (동적 코드 생성 등을 포함하는 일부 더러운 반사 트릭이있을 수 있습니다)입니다 :

  1. 계승. 봉인 된 Rectangle, Ellipse 등을 사용하기 때문에 불가능합니다.
  2. 부분 클래스. .NET은 Shape, Rectangle 등을 부분 클래스로 제공하지 않기 때문에 작동하지 않습니다.
  3. 연장 방법. 가장 우아한 솔루션이지만 클래스가 메서드 자체를 제공하지 않는 경우에만 확장 메서드가 사용되기 때문에 작동하지 않습니다. 그리고 ToString()은 모든 클래스가 상속하는 System.Object에 제공되므로 기술적으로 Shape, Rectangle 등은 ToString() 메서드를가집니다.

그래서 내가 두 가지 옵션 중 하나를 고려할 것 :

  • Shape을 받아 문자열을 반환하는 유틸리티 클래스의 정적 메서드 string GetStringInfo(Shape s) 만들기를, 다음 사방이에 ToString()을 사용하여이 기능을 사용 Shape.
  • 는 리팩토링을 최소화 유형 Shape에 확장 메서드 string GetStringInfo()을 만들고 사람이 작동하는 다른 솔루션을 알고 있다면, 나도 그 관심이 것 대신 ToString()

의이 방법을 사용하려면 코드를 리팩토링합니다.

+1

+1 - 포인트 3. 그리고 두 번째 글 머리 기호가 가장 우아한 해결책 인 것 같습니다. –

0

아니오; 너는 그렇게 할 수 없다.

대신 DataTemplate을 사용해야합니다.

+0

OP가 WPF 태그를 제거한 것으로 보입니다. –

+0

@PetarRepac : 질문과 관련이 없으므로 사실, 그랬습니다. 내가 다시 가져 가야한다고 생각하니? – SLaks

+0

Slakses 답변은 WPF 컨텍스트에 있다고 생각합니다. –

0

언제든지 Shape를 클래스의 내부 필드로 사용할 수 있으며 ToString() 메서드 호출에서 _shape.ToString()을 호출 할 수 있습니다. 나는 이것이 가능하다고 생각하지 않는다

+0

Shape를 상속하고 ToString()을 재정의하는 것과 같습니다. –

+1

아니요, 그렇지 않습니다. Shape에서 상속하는 경우 클래스는 Shape에있는 모든 공개 멤버를 게시합니다. 그리고 당신은 그들을 숨길 수 없습니다. 클래스 내에 Shape 인스턴스가 포함되어있는 경우 클래스의 클라이언트가 액세스 할 수있는 멤버를 선택할 수 있습니다. 예 : Shape에 Draw() 메소드가있는 경우, 클래스는이 메소드를 숨길 수 있습니다. –

+0

이것은 컨트롤입니다. 통제권을 상속받지 않는 것이 좋다고 생각하지만 개인 필드로 유지하는 것이 좋습니다. –

관련 문제