2013-08-09 13 views
6

Sono quasi certo che questo è correlato all'implementazione di interfacce ed ereditarietà.Come C# System.Type Type ha una proprietà name

In C# in che modo la classe System.Type ha la proprietà Nome? Quando ho ad esempio il codice della classe Type da metadati o utilizzando il Visualizzatore oggetti vedo classe Type non ha:

string Name 

definito da nessuna parte.

Vedo anche che tipo eredita da MemberInfo e implementa _Type e IReflect (come questo):

public abstract class Type : MemberInfo, _Type, IReflect 

La classe di base MemberInfo ha la proprietà:

public abstract string Name { get; } 

Da quello che so, questo ha da sovrascrivere nella classe derivata a causa del modificatore astratto. Io non la vedo in Tipo ...

Poi nell'interfaccia _Type c'è una proprietà:

string Name { get; } 

e perché questo è in un'interfaccia ha alcuna implementazione della propria sia.

Dove viene definito il nome e in che modo ha un valore nella classe System.Type? O non sto capendo come funziona l'ereditarietà e l'implementazione delle interfacce per questa classe

risposta

10

Si noti che System.Type è di per sé una classe astratta. Ciò significa che può essere annullato in una sottoclasse. In realtà, si può vedere che tipi in fase di esecuzione non sono in realtà System.Type 's se si fa qualcosa di simile:

typeof(Type).GetType().FullName; // System.RuntimeType 

Il System.RuntimeType è un tipo interno che non si vedrà nella documentazione, ma fa ignora la proprietà Name. Sembra un po 'come questo:

namespace System 
{ 
    internal class RuntimeType : Type, ISerializable, ICloneable 
    { 
     ... 
     public override string Name 
     { 
      get { ... } 
     } 
    } 
} 

Vai a questa nota nel official documentation:

Tipo è una classe base astratta che consente implementazioni multiple. Il sistema fornirà sempre la classe derivata RuntimeType. In riflessione, tutte le classi che iniziano con la parola Runtime vengono create una sola volta per oggetto nel sistema e supportano le operazioni di confronto.

1

La proprietà astratta Name da MemberInfo è infatti ereditato dal System.Type.

Il motivo per cui System.Type è in grado di implementare l'interfaccia, è che a un membro di istanza astratto è consentito implementare un'interfaccia, purché tale membro sia pubblico, ovviamente, quale è Name. I membri che implementano interfacce possono essere ereditati dalle classi base.

Il motivo per cui System.Type è permesso non sovrascrivere la proprietà Name, è che System.Type è di per sé una classe astratta. Quindi può "lasciare" il membro astratto senza alcuna implementazione. I tipi non astratti che ne derivano devono comunque fornire un'implementazione per questa proprietà (la sua accessoria get).

Ogni volta che si dispone di una variabile Type t = ...; e chiamare t.Name su di esso, il tipo run-time di t dovrà essere un po 'di classe non astratta, e che la classe avrà un'implementazione di Name.

Problemi correlati