2011-12-26 3 views
2

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

Примечание Я не хочу этого: Shpae1: Форма переопределение ....

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

+0

Можете ли вы дать нам более подробную информацию? Вы хотите использовать Shape.ToString() без наследования от Shape? Если да, то почему? –

+0

OP говорит, что вопрос не зависит от WPF. Что теперь ? –

+0

@PetarRepac: Нет; ОП не сказал этого. – SLaks

ответ

2

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

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

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

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

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

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

+1

+1 - точка 3., а вторая пуля кажется самым элегантным решением в порядке –

0

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

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

+0

Кажется, что OP удалил тег WPF. –

+0

@PetarRepac: Собственно, я сделал это, поскольку это не имело отношения к вопросу. Думаешь, я должен вернуть его? – SLaks

+0

Я думаю, что ответ Slakses в контексте WPF. –

0

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

+0

То же самое, что и наследование формы и переопределение ToString() –

+1

Нет, это не так. Если вы наследуете Shape, ваш класс опубликует все публичные члены Shape. И вы не можете скрыть их. Если вы содержите экземпляр Shape внутри своего класса, вы можете выбрать, какие члены вы хотите быть доступными для клиентов вашего класса. Например. если Shape имеет метод Draw(), ваш класс может скрыть этот метод. –

+0

Это контроль. Вы считаете хорошей практикой не наследовать контроль, а скорее хранить их как частные поля? –