2009-08-28 4 views
2

Si mon interface a la signature uniquement pour getter tels que:setter pour une propriété non définie dans l'interface

public interface IInterface 
{ 
    object Id{get;} 
} 

Ainsi, l'interface dicte qu'un getter public Id sur une classe implémentée maintenant quand j'ai la classe:

public class Simple : IInterface 
{ 
    object Id 
    { 
    get{return something;} 
    set{ do something else;} 
    } 
} 

le compilateur se plaint du régleur car le setter n'est pas défini dans l'interface. Cependant, je n'ai rien dicté sur le contrat d'interface pour un setter; pourquoi l'interface insiste-t-elle sur le setter sur les classes dérivées?

+0

Quelle est l'erreur réelle du compilateur? –

+0

L'erreur de compilation que vous obtenez de sa classe serait que l'ID ne peut pas implémenter l'interface car elle est non publique. –

Répondre

11

Vous avez juste besoin de rendre l'identification publique. Par exemple, il compile bien:

public interface IInterface 
{ 
    object Id { get; } 
} 
public class Simple : IInterface 
{ 
    private int something; 
    public object Id 
    { 
     get { return something; } 
     set{ something = (int)value;} 
    } 
} 
+0

Lorsque je déclare l'Id comme déclaration explicite je ne peux pas utiliser public, savez-vous pourquoi? – VolkanUzun

+0

Oui. Les déclarations explicites sont différentes - elles sont intrinsèquement publiques mais UNIQUEMENT lorsqu'elles sont utilisées comme interface (les interfaces sont toujours publiques). Cependant, une implémentation explicite ne permettra pas le setter, puisque l'interface (qui est ce que vous utiliseriez) n'aura qu'un getter sur la propriété. –

+0

mais encore une fois, pourquoi l'interface se soucie-t-elle du setter? Je vois que l'interface interprète le code: il n'y a qu'un getter donc ça devrait être readonly; mais ne peux pas interpréter aussi est comme: je me soucie seulement qu'il devrait y avoir un getter; c'est le contrat; Je m'en fous du setter – VolkanUzun

1

Dans la conception .net, Microsoft a décidé d'y faire trois types non interchangeables de propriétés: lecture seule, écriture seule et lecture-écriture. En C#, si on déclare une propriété en lecture-écriture avec le même nom qu'une ou plusieurs propriétés d'interface que l'on est supposé implémenter, le compilateur peut créer automatiquement non seulement la propriété en lecture-écriture que le programmeur a spécifié, mais aussi en lecture seule. ou des propriétés en écriture seule si nécessaire pour satisfaire les interfaces. Par exemple, si l'interface IReadableFoo implémente une propriété en lecture seule Foo, IWritableFoo implémente une propriété en écriture seule Foo et IReadWriteFoo hérite de IReadableFoo et IWritablefoo, et implémente une "nouvelle" propriété en lecture-écriture Foo, et une classe ReadWriteFoo implémente IReadWriteFoo et déclare une propriété publique en lecture-écriture Foo, le compilateur aura ReadWriteFoo générer des implémentations d'interface de la propriété en lecture seule IReadableFoo.Foo, la propriété en écriture seule IWritableFoo.Foo, et la propriété en lecture-écriture IReadWriteFoo.Foo.

Questions connexes