2008-11-10 3 views
7

У меня есть открытый статический класс, в котором я хотел бы иметь метод ToString().Как вы переопределяете ToString в статическом классе?

Я определил его как общественная статическую строку ToString(), но получаю следующее предупреждение:

'Class.ToString()' скрывает унаследовал член 'Object.ToString()'. Чтобы заставить текущий элемент переопределить эту реализацию, добавьте ключевое слово переопределения. В противном случае добавьте новое ключевое слово.

Если я добавляю переопределить ключевое слово, я получаю эту ошибку вместо того, чтобы:

Статический член 'Class.ToString()' не может быть помечен как переопределение, виртуальный или абстрактный

Как мне избавиться от этого предупреждения, и пусть мой статический класс имеет метод ToString().

Спасибо,
Keith

+0

Могу ли я спросить, почему вы хотели бы это сделать? (Просто любопытно) – StingyJack 2008-11-10 16:42:44

+0

У меня есть ErrorLog, который является статическим классом, через мой код я могу добавить ErrorLogItem в ErrorLog. ErrorLog может сохранять себя в базе данных, сохраняя все ErrorLogItems. Если база данных недоступна (основная ошибка), я могу преобразовать весь журнал в строку и сохранить ее на диск. – 2008-11-10 16:47:44

+0

Две вещи об этом обсуждении. Во-первых, вы должны были упомянуть, что вы имели в виду .NET, хотя это стало ясно из написания и последующего обсуждения. – orcmid 2008-11-10 16:53:15

ответ

12

Да, использование «нового» модификатора будет эффективно отключать предупреждение компилятора, но вы явно скрываете метод экземпляра со статическим методом. (Это отличается от переопределения метода.) Обычно вы не хотите скрывать метод экземпляра, за исключением очень хороших причин, и вам действительно не следует скрывать его со статическим методом, так как это действительно изменяет семантику поведения вызова. Каждый объект в .NET имеет метод экземпляра с именем ToString(), который имеет определенное поведение, которое ожидают разработчики; скрывая это поведение с помощью нового статического метода, вы меняете это ожидание, которое может привести к большой путанице.

Что вы «нанизаны»? Статические классы обычно не содержат внутреннего состояния, поэтому на самом деле не должно быть никаких внутренних данных, которые будут представлены в качестве логического вывода вызова ToString(). Возможно, вам захочется переосмыслить дизайн вашего класса или указать другое имя метода, которое более четко указывает цель метода, не скрывая экземпляр ToString().

3

В статическом классе вы не можете переопределить ToString. .ToString - это метод экземпляра, и по определению статический класс может иметь только статические элементы.

Также почему вы хотите переопределить .ToString()? Невозможно получить экземпляр класса и, следовательно, не использовать функцию.

Примечание. Использование нового синтаксиса не будет переопределять .ToString. Он создаст новый член, который полностью не связан с методом Object.ToString().