У меня есть интерфейс IKey
, который я хочу иметь метод, который будет возвращать ключ в виде строки.Мы рассмотрели метод, подобный следующему:
String GetAsString();
, который возвращал бы строковое представление, но хотел бы иметь возможность снова объявить ToString()
в интерфейсе, чтобы заставить разработчиков реализовать его, но этоне заставляет их, поскольку у них есть реализация, унаследованная от Object
.Было предложено:
public interface IKey
{
string ToString(string dummyParameter=null);
}
это вызывает реализацию метода в любом реализующем классе, но из-за способа работы дополнительных параметров вызывающим абонентам не нужно предоставлять значение для этогои вы гарантируете, что любые вызовы метода ToString()
для объектов, которые преобразуются как интерфейс IKey
или реализующий класс, всегда будут вызывать реализацию класса, а не реализацию Object
.
Inреализации, которые мы можем просто игнорировать dummyParameter
и возвращать то, что мы хотим, в безопасности, зная, что вызов ToString()
всегда на самом деле вызовет ToString(null)
.
Теперь мне кажется, что это неправильно, но вв то же время в нем есть что-то очень приятное.Это почти то же самое, что и метод GetAsString()
, так как его можно вызывать только на интерфейсе IKey
и производных классах, за исключением того, что он выглядит как более естественный метод ToString()
, который мы хотим использовать и который мы можемзаставить реализацию в дочернем классе.
Сказав, что фиктивный параметр, который не используется, кажется неправильным.
Так это ужасно?Или отлично?
И подходит ли этот вопрос для SO или он должен быть для программистов?
Примеры
public class Key :IKey
{
public string ToString(string abc = null)
{
return "100";
}
}
Key key = new Key ();
Trace.WriteLine (key.ToString());
Trace.WriteLine (key.ToString(null));
Trace.WriteLine (key.ToString("ac"));
Trace.WriteLine (((object)key).ToString());
output:
100
100
100
Blah.Tests.Key