: Cheers :)
Geçmişte
ToString() türetilmiş sınıfları geçersiz kılındı edilmesi gereken ettik, hep aşağıdaki gibi bir desen kullandım Sorunuz, ama sorduğunuz şeyi yapmanın bir yolu olmadığından, diğerlerinin görmesi için kendi yaklaşımımı paylaşacağımı düşündüm.
Mark ve Andrew'un önerdiği çözümlerin bir melezini kullanıyorum. Benim uygulamada
, tüm etki alanı varlıklar soyut baz sınıftan türetmek:
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();
}
}
kendisi sadece basit erişimcisine tanımlar arayüzü:
public interface IHasDescription : IEntity
{
/// <summary>
/// Creates a description (in english) of the Entity.
/// </summary>
string EntityDescription { get; }
}
Yani şimdi bir geri düşmeyi var - veya başka bir deyişle, IHasDescription
'u uygulayan Entity
numaralı mekanizma EntityDescription
'u sağlamalıdır, ancak herhangi bir Entity
hala bir dizeye dönüşebilir.
Burada önerilen diğer çözümlerden tamamen farklı olmadığını biliyorum, ancak Entity
türünün sorumluluğunu en aza indirgeme fikrini beğeniyorum, böylece açıklama arayüzünü uygulamak isteğe bağlı kalır, ancak Arabirimi uygularsanız, aslında açıklama yöntemini uygulayın.
IMHO, uygulandığı şekliyle "saymak" olmamalıdır object
baz sınıfı tarafından uygulanan arabirimler - oh iyi, bunun için bir derleyici seçeneği olması güzel olurdu, ama ...
http: // stackoverflow.com/questions/239408/can-i-force-subclasses-to-override-a-method-without-making-it-abstract <-? aynı? ya da sadece çok benzer? –