Résumé de la propriété publique de lecture, de définir privé setter dans la classe de béton possible?
Je suis en train de créer une classe abstraite qui définit une propriété avec un getter. Je veux laisser aux classes dérivées de décider si elles veulent mettre en œuvre un setter de la propriété ou non. Est-ce possible?
Ce que j'ai à ce jour:
public abstract class AbstractClass {
public abstract string Value { get; }
public void DoSomething() {
Console.WriteLine(Value);
}
}
public class ConcreteClass1 : AbstractClass {
public override string Value { get; set; }
}
public class ConcreteClass2 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public string Value {
set { _value = value; }
}
}
public class ConcreteClass3 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public void set_Value(string value) {
_value = value;
}
}
Dans ConcreteClass1
, j'obtiens une erreur sur le set
. Il ne peut pas remplacer set_Value
car pas substituables accesseur set existe en AbstractClass.
Dans ConcreteClass2
, j'obtiens une erreur sur les deux Value
's car un membre avec le même nom est déjà déclaré.
ConcreteClass3
ne donne pas une erreur, mais même si la Valeur de l'accesseur set seraient rassemblés dans set_Value, il ne fonctionne pas dans l'autre sens. La définition d'un set_Value
ne signifie pas que Value
obtient un accesseur set. Donc je ne peut pas affecter une valeur à une ConcreteClass3.La valeur de la propriété. Je peut utilisation ConcreteClass3.set_Value("valeur"), mais ce n'est pas ce que je suis en train de réaliser ici.
Est-il possible d'avoir la classe abstraite de la demande d'un public de lecture, tout en permettant à l'option d'un setter pour être définie dans une classe dérivée?
Dans le cas où vous r'vous demandez-vous, c'est juste une question théorique. Je n'ai pas une situation réelle où quelque chose comme cela est nécessaire. Mais je ne peux imaginer une classe abstraite qui ne se soucie pas de la façon dont une propriété est défini, mais qui ne doivent être en mesure d'obtenir la propriété.
Vous devez vous connecter pour publier un commentaire.
Malheureusement, vous ne pouvez pas faire exactement ce que vous voulez. Vous pouvez faire cela avec des interfaces bien:
La façon dont je voudrais faire c'est d'avoir une méthode SetProperty dans les classes concrètes:
interface
, je ne peux pas mettre en œuvre laDoSomething
méthode dans ma classe de base (il n'y a pas de classe de base, juste une interface). À l'aide deSetValue
est le même que leset_Value
dans monConcreteClass3
. Mais si c'est le chemin à parcourir, en le nommantSetValue
est probablement mieux queset_Value
.PropertyDef
définition dans l'assemblée qui relie laget_
etset_
méthodes; il suffit de nommer une méthodeset_
ne permet pas d'accéder à une propriété. Il n'y a pas moyen de faire exactement ce que vous voulez en C#; vous aurez à faire des compromis.DoSomething
comme une extension de la méthode surIInterface
. Voir mon edit.Trouvé une solution: Comment remplacer une lecture-seule propriété avec un setter en C#?
D
est maintenant équivalent à une classe héritant deB
tout en étant capable de remplacer dans un setter.Pas très élégant, mais il est le plus proche que vous pouvez obtenir sans faire quelque chose que vous avez dans concreteclass3
new DoSomething
dans la classe de béton. Aussi, vous r'solution va lever une exception lors de l'exécution, au moment de la compilation, l'absence de Valeur de la mise en œuvre ne sera pas remarqué du tout.