Как вы переопределяете ToString в статическом классе? - PullRequest
9 голосов
/ 10 ноября 2008

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

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

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

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

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

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

Спасибо,
Кит

Ответы [ 3 ]

12 голосов
/ 10 ноября 2008

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

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

3 голосов
/ 10 ноября 2008

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

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

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

2 голосов
/ 10 ноября 2008

Хорошо, поэтому, задавая вопрос, я нашел ответ:

Новый модификатор:

http://msdn.microsoft.com/en-us/library/51y09td4(VS.71).aspx#vclrfnew_newmodifier

вот метод сейчас:

публичная новая статическая строка ToString ()

Спасибо, Кит

...