Znam ten nie odpowie Twoje pytanie, ale ponieważ nie ma sposobu, aby zrobić to, o co prosisz, pomyślałem, że podzielę się własnym podejściem, aby inni mogli je zobaczyć.
Używam hybrydy proponowanych przez Marka i Andrew rozwiązań.
W mojej aplikacji, wszystkie domeny jednostki wywodzą się z abstrakcyjnego bazowej klasy:
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();
}
}
Interfejs sama tylko definiuje prostą akcesor:
public interface IHasDescription : IEntity
{
/// <summary>
/// Creates a description (in english) of the Entity.
/// </summary>
string EntityDescription { get; }
}
Więc teraz jest spadek-back wbudowany mechanizm - lub inaczej: Entity
, który implementuje IHasDescription
, musi dostarczyć EntityDescription
, ale dowolny Entity
może nadal konwertować na ciąg znaków.
Wiem, że nie różni się to radykalnie od innych proponowanych tutaj rozwiązań, ale podoba mi się pomysł zminimalizowania odpowiedzialności typu bazowego Entity
, więc implementacja interfejsu opisu pozostaje opcjonalna, ale jesteś zmuszony faktycznie zaimplementuj metodę opisu, jeśli implementujesz interfejs.
IMHO, interfejsy, które są realizowane przez bazowej klasy object
nie powinno „Count”, jak realizowane - byłoby miło mieć opcję kompilatora, ale, no cóż ...
http: // stackoverflow.com/questions/239408/can-i-force-subclasses-to-override-a-method-without-making-it-abstract <-? podobnie? lub po prostu bardzo podobne? –