Wie finden Sie den folgenden Code? Ist das gut? Wenn ja, warum ist es? Wenn nicht, warum nicht? Und wie sieht CLR diesen Code?Wie diese generische Vererbung gemacht wird (intern)?
public abstract class EntityBase<TEntity> : IEquatable<TEntity>
{
public bool Equals(TEntity other)
{
// check equalitiy
}
// yes, below is object's Equals and GetHashCode method implementation
}
public class Person : EntityBase<Person>
{
}
Ich habe ein bisschen seltsames Gefühl auf diesem. Wie Huhn und Ei Problem. Und hier ist .Net-Framework-Code, der das gleiche Verhalten hat.
public sealed class String : IComparable<string>, IEquatable<string> // I removed other interfaces
Irgendwelche Gedanken?
Ordentlich, ich wusste nicht, was Sie tun können, dass :) –
Obwohl die Definition kreisförmig erscheint, ist es nicht. Der C# -Compilerzyklus-Erkennungsalgorithmus ist jedoch sowohl _wrong_ als auch _weak_. Falsch, weil es Nicht-Zyklen fälschlicherweise als Zyklen erkennt, und schwach, weil es bestimmte sehr unangenehme Zyklen nicht erkennt. Wenn dieses Thema Sie interessiert, finden Sie meinen Artikel hier: http://blogs.msdn.com/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not -beyond.aspx –
Der Pseudo-Zyklus in den generischen Definitionen ist in Ordnung. Mich beunruhigt allerdings die Beziehung "Person: EntityBase". Ich bevorzuge meine Typhierarchien, um reale Beziehungen zu modellieren: Ein Mensch ist ein Säugetier. Ein Mitarbeiter ist eine Person. Eine Zeitung ist eine Veröffentlichung. Eine Person ist eine "Entity Base of Person".Was in aller Welt bedeutet das? –