Ne peut pas mettre en œuvre une interface membre parce qu'il n'est pas public
J'ai écrit certains de code en VB que j'ai converti en C# à l'aide de Sharp Développer des IDE.
J'ai défini une Interface, IElement
, qui est mis en œuvre par des objets qui renvoient XML représentations d'eux-mêmes. Tout objet qui implémente cette interface doit être en mesure de retourner à son nom de balise et c'est la chaîne XML de représentation. Pour obtenir la chaîne de caractères XML, il peut avoir à boucle à travers son enfant/collection imbriquées pour obtenir la représentation XML de l'ensemble de ses objets enfants.
Des Classes qui héritent de l'Élément de l'utilisation de la GetXml et GetNestedXml de sa classe de base, ou choisir de l'ignorer, mais la GetNestedXml fonction n'aurait pas à être public, car il ne serait appelé à partir de la public GetXml fonction des classes dérivées. Par conséquent, dans l'original de la version de visual basic, le champ d'application de la GetNestedXML a été mis à protégé. Cependant, Forte de Développer et j'ai des problèmes en essayant de convertir ce code en C#. Consultez l'erreur ci-dessous.
Sur une note de côté, je me rends compte qu'il pourrait y avoir de meilleures façons de mettre en œuvre et je serais intéressé à côté des suggestions qui sont faciles sur les flammes. 🙂 Merci.
Public Interface IElement
ReadOnly Property TagName() As String
ReadOnly Property GetXml(Optional ByVal targetXml As Integer = TargetXmlEnum.All) As String
Function GetNestedXml() As String
End Interface
Public Class Element
Implements IElement
Public ReadOnly Property TagName() As String Implements IElement.TagName
Get
'....
End Get
End Property
Public Overridable ReadOnly Property GetXml(Optional ByVal targetXml As Integer = TargetXmlEnum.All) _
As String Implements IElement.GetXml
Get
'....
End Get
End Property
Protected Overridable Function GetNestedXml() As String Implements IElement.GetNestedXml
'....
End Function
End Class
Converti En C# :
public interface IElement
{
string TagName { get; }
string GetXml { get; }
string GetNestedXml();
}
public class Element : IElement
{
public string TagName {
get { //... }
}
public virtual string GetXml
{
get
{
//...
}
}
protected virtual string GetNestedXml()
{
//...
}
}
erreur:
Error 1 'Smit.SpreadsheetML.Element' does not implement interface member 'Smit.SpreadsheetML.IElement.GetNestedXml()'. 'Smit.SpreadsheetML.Element.GetNestedXml()' cannot implement an interface member because it is not public. D:\Users\Chad\Desktop\SMIT\SMIT.SpreadsheetML.ConvertedToC#\Element.cs 41 24 Smit.SpreadsheetML.Converted
Seulement supprimer les Protégés de "protégés chaîne virtuelle GetNestedXml()" mise en œuvre
elle donnera l'erreur de pièce virtuelle protégée est supprimé.
Je veux dire protégé et virtuel à la fois, et pourquoi vous voulez virtuel, là-bas ?
OriginalL'auteur ChadD | 2014-02-20
Vous devez vous connecter pour publier un commentaire.
Le moyen rapide de résoudre ce problème est de faire GetNestedXml public. Si vous ne voulez pas cela, vous pouvez également déclarer GetNestedXml protégé méthode abstraite dans une classe de base abstraite. Mais cela signifie que toutes les classes doivent dériver de cette classe de base et de mettre en œuvre la méthode. Si vous souhaitez fournir une mise en œuvre dans la classe de base, vous pouvez également faire de la méthode virtuelle, de sorte que les classes dérivées peuvent mais n'ont pas nécessairement besoin de le remplacer. Afin de parvenir à cela, effectuez les étapes suivantes:
Un autre moyen de masquer la méthode consisterait à mettre en œuvre IElement explicitement, de sorte que les appelants ne vois que ça, lors de l'accès à l'objet à l'aide de l'interface.
si le fait que toutes les classes ont de dériver de la classe de base est ok dans votre scénario, c'est la meilleure solution. Vous n'avez pas besoin de faire de la méthode abstraite. Vous pouvez aussi le faire virtuel et de fournir une base de mise en œuvre que les classes dérivées peuvent les remplacer si nécessaire.
Il me manque la partie sur ce que je dois faire pour que cela se produise. Je pense que c'est ce que j'avais dans la version de visual basic. Je l'ai fait faire il virtuel et de fournir une base de mise en œuvre. Cependant, je ne veux pas qu'il soit public, uniquement accessible à partir des sous-classes, donc protégées.
J'ai mis à jour la réponse avec le nombre d'étapes nécessaires.
Ouais, le retrait de la GetNestedXml à partir de l'Interface a été la clé, je crois, à le faire fonctionner. Quand j'ai écrit "je suis ouvert aux suggestions sur la manière de concevoir ce" je me demandais si une interface a même été utile ou si je dois juste mettre tout sur la classe de base. Je n'ai pas le fort de la programmation orientée objet, les côtelettes, mais mon petit doigt me dit préférer les interfaces parce qu'une classe peut implémenter plusieurs, mais seulement hériter d'une classe de base, donc j'aurais plus de flexibilité. Je suis aussi un peu perplexe pourquoi le code VB ne convertit pas tout à fait aussi bon que C# sur ce qui me semble être à la base de la programmation orientée objet fonctionnalités. J'ai attendu que la syntaxe de diff.
OriginalL'auteur Markus
Comme des implémentations d'Interface doivent être publics ou explicite:
modifier cette méthode
à
Modifier
créer une Interface comme ceci:
créer une classe de base abstraite comme ce
Impelement de votre Élément de la classe
vérifier mon montage dans asnwer, j'espère que cela vous aide à vous maintenant
Yep, plusieurs réponses semblent en ligne maintenant et j'ai donc eu de la difficulté à choisir "la" réponse. Merci à tous
Merci de poser cette question qui nous permettent d'apprendre des choses aussi. pas de soucis pour la "Réponse" du tchad. L'apprentissage est important 🙂
OriginalL'auteur Saghir A. Khatri
Une interface déclaré les responsabilités de toutes ses hériter instances. Si vous ne pouvez pas utiliser les pas-méthode publique pour mettre en œuvre votre méthode de l'interface.
Si elle est non-public, pour toute raison autre chose, je suggère que vous pouvez utiliser la classe abstraite et l'utilisation d'un résumé/méthode virtuelle de la déclarer.
méthode abstraite comme ceci:
méthode virtuelle:
OriginalL'auteur workingbird
Le truc, c'est que, lorsque vous déclarez
Element
implémenteIElement
vous dites: "Hé, je sais comment obtenir mon XML imbriqués, et chacun peut l'utiliser! (...)".Sur votre classe le
GetNestedXml
est protégé, c'est à dire vous n'êtes pas remplir votre déclaration.Même si vous n'explicite
protected
mise en œuvre:Derrière les coulisses, Il sera toujours fait être public.
Son édition est correcte. Une autre chose, il n'y a pas suffisamment d'informations sur l'utilisation de la
GetNestedXml
. Si c'est un comportement attendu de certaines classes, indépendamment de leur arbre d'héritage, l'Interface est le chemin à parcourir. Utiliser leabstract
est la voie à suivre si ce comportement est attendu en provenance d'un arbre d'héritage. Aussi, vous voudrez peut-être jeter un oeil àixmlserializable
Il pourrait être utile...OriginalL'auteur Avi Turner