Переопределение ToString () - PullRequest
       2

Переопределение ToString ()

2 голосов
/ 27 декабря 2011

Есть ли способ переопределить метод ToString () в классе Shape, не наследуя его и не делая это в унаследованном классе? Поэтому всякий раз, когда я вызываю какой-либо из методов «строки», я получаю переопределенный метод?

Обратите внимание, я не хочу этого: Shpae1: форма переопределить ....

Причина, по которой я не хочу этого делать, заключается в том, что у меня уже есть много фигур в моем проекте, эллипсы, прямоугольники и т. Д. (Общие). Я хочу напечатать расположение каждой фигуры. Я знаю, что мог бы использовать отдельную функцию, принимающую форму в качестве аргумента, но у меня уже есть некоторый код, который использует строку строки формы, поэтому я подумал, что это будет более элегантно, если Я мог бы просто изменить метод toString, чтобы мне не пришлось менять какой-либо мой код.

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Я не думаю, что это возможно (также могут быть некоторые грязные уловки отражения, включающие динамическое генерирование кода и т. Д.)

Основные способы расширения существующего класса, такие как Shape:

  1. Наследовать .Это невозможно, потому что вы используете Rectangle, Ellipse и т. Д., Которые запечатаны.
  2. Частичный класс .Не работает, потому что .NET не предоставляет Shape, Rectangle и т. Д. В качестве частичных классов.
  3. Метод расширения .Было бы наиболее элегантным решением, но оно также не работает, потому что методы расширения используются, только если класс не предоставляет сам метод.И ToString() предоставляется в System.Object, от которого наследуется каждый класс, поэтому технически Shape, Rectangle и т. Д. Имеют метод ToString(), даже если они сами не переопределяют их.

Итак, я бы рассмотрел один из двух вариантов:

  • Создайте статический метод string GetStringInfo(Shape s) в служебном классе, который принимает Shape и возвращает строку, а затем используйте эту функцию везде, где выиспользуйте ToString() для Shape.
  • Чтобы минимизировать рефакторинг, создайте метод расширения string GetStringInfo() для типа Shape и измените код, чтобы использовать этот метод вместо ToString()

Если кто-нибудь знает другое рабочее решение, меня это тоже заинтересует.

0 голосов
/ 27 декабря 2011

Вы всегда можете использовать Shape как внутреннее поле вашего класса и при вызове метода ToString () _shape.ToString ().

0 голосов
/ 27 декабря 2011

Нет; ты не можешь этого сделать.

Вместо этого вам, вероятно, следует использовать DataTemplate.

...