Силу подклассы интерфейс для реализации метода toString
скажем, у меня есть интерфейс IFoo и я хочу, чтобы все подклассы IFoo для переопределения объекта ToString метод. Это возможно?
простое добавление сигнатуры метода в IFoo как таковой не работает:
interface IFoo
{
String ToString();
}
так как все подклассы расширяются Object и обеспечить реализацию таким образом, чтобы компилятор не жаловался на это. Есть предложения?
7 ответов:
Я не верю, что вы можете сделать это с интерфейсом. Вы можете использовать абстрактный базовый класс, хотя:
public abstract class Base { public abstract override string ToString(); }
abstract class Foo { public override abstract string ToString(); } class Bar : Foo { // need to override ToString() }
в прошлом, когда я требовал, чтобы ToString() переопределялся в производных классах, я всегда использовал шаблон, подобный следующему:
public abstract class BaseClass { public abstract string ToStringImpl(); public override string ToString() { return ToStringImpl(); } }
реализация метода интерфейса неявно запечатывает метод (а также переопределяет его). Поэтому, если вы не скажете иначе, первая реализация интерфейса завершает цепочку переопределения в C#.
абстрактный класс = ваш друг
Регистрация этот вопрос
Я знаю, что это не ответ на ваш вопрос, но поскольку нет никакого способа сделать то, что вы просите, я подумал, что поделюсь своим собственным подходом для других.
я использую гибрид предложенных Марком и Эндрю решений.
в моем приложении, все доменные объекты являются производными от абстрактного базового класса:
public abstract class Entity { /// <summary> /// Returns a <see cref="System.String"/> that represents this instance. /// </summary> public override string ToString() { return this is IHasDescription ? ((IHasDescription) this).EntityDescription : base.ToString(); } }сам интерфейс определяет только простой метод доступа:
public interface IHasDescription : IEntity { /// <summary> /// Creates a description (in english) of the Entity. /// </summary> string EntityDescription { get; } }так что теперь есть механизм отката встроенный-или в другом слова, Ан
Entityчто реализуетIHasDescriptionдолжен предоставитьEntityDescription, но ниEntityеще можно преобразовать в строку.Я знаю, что это не радикально отличается от других решений, предлагаемых здесь, но мне нравится идея минимизации ответственности основания
Entityтип, так что реализация интерфейса описания остается необязательной, но вы вынуждены фактически реализовать метод описания, если вы реализуете интерфейс.ИМХО, интерфейсы, реализуются с помощью
objectбазовый класс не должен "считать" реализованным - было бы неплохо иметь для этого опцию компилятора, но, Ну хорошо...
Я не думаю, что вы можете заставить любой подкласс переопределить любой из виртуальных методов базового класса, если эти методы не являются абстрактными.
жаль хоронить эту старую нить из могилы, особенно как наш дорогой @jon-skeet уже дал свой собственный ответ.
но если вы хотите сохранить интерфейс и не использовать абстрактный класс, я думаю, это еще возможно, просто имея свой интерфейс реализации
Comments