2010-05-12 6 views
2

Comment puis-je hériter d'une propriété dans C# à partir d'une interface et donner à cette propriété un autre nom dans la classe?C# Question d'héritage de propriété

Par exemple:

public interface IFoo 
{ 
    int Num {get;set;} 
} 

public class IFooCls : IFoo 
{ 
    int Ifoo.Num{get;set} 
} 

Dans ce cas, ce que le nom de la propriété dans l'interface est également la même dans la classe. Ce que je veux c'est donner un autre nom de propriété sur la classe mais en pointant toujours sur "Num" dans l'interface dans ce cas. En VB, nous pouvons le faire comme ceci:

Public ReadOnly Property UserId() As String Implements System.Security.Principal.IIdentity.Name 
    Get 
     Return _userId 
    End Get 
End Property 
+0

Peut-être en expliquant exactement ce que vous voulez faire, vous pouvez obtenir de meilleurs conseils, car comme @Oded l'a dit, cela va à l'encontre de ce que l'héritage est –

+0

ok, ce que je voulais vraiment c'est, j'ai besoin d'implémenter System.Security.Principal. IIdentité. Il a une propriété de nom. Mais je faisais une classe d'identité personnalisée, et je voulais que la propriété Name de cette classe soit changée en UserID à la place. –

+0

En VB, nous pouvons le faire comme le code ci-dessus. Existe-t-il un moyen simple de faire le code vb ci-dessus dans C#. Je sais que nous pouvons avoir du travail dans celui-ci en ajoutant d'autres biens comme ce que @Igor Zevaka posté ci-dessous. –

Répondre

0

Si vous héritez d'une propriété, vous héritez, le nom, le type et tout. Il n'y a aucun moyen de changer le nom.

Si vous le souhaitez, vous pouvez écrire une autre propriété avec un nom différent et appeler la propriété héritée (vous devez toujours implémenter la propriété d'origine).

Voir ce que vous pouvez faire sur this MSDN page.

La seule façon d'obtenir ce que vous voulez (ont une propriété UserIdet impelement IIdentity) est d'appeler IIdentity.Name de celui-ci).

Cela permet de masquer la propriété IIdentity.Name des utilisateurs de votre classe (à moins qu'ils jettent à IIdentity):

public class myIdentity : IIdentity 
{ 
    public string IIdentity.Name {get; set;} 

    public string UserId 
    { 
     get 
     { 
     return IIdentity.Name; 
     } 

     set 
     { 
     IIdentity.Name = value; 
     } 
} 
+0

c'est ce que nous étions en train de faire. –

+0

@mcxiand - C'est la seule façon de le faire, en C#. La seule autre "solution" serait de l'implémenter dans un projet VB.NET et de référencer ce projet dans vos projets C#;) – Oded

1

Voici un moyen de simuler ce que vous essayez de faire en C#

public interface Foo { 
    string Name {get;set;} 
} 

pubilc class Bar : Foo { 

#region Foo implementation 
    public string Name {get{return UserName;} set{UserName = value;}} 
#endregion //Foo implementation 

    public string UserName {get; set;} 
} 
+1

Vous pouvez utiliser une implémentation explicite de l'interface pour "cacher" le membre 'Name' des utilisateurs du' Bar' classe. Je crois que c'est comme ça que VB.NET fait ça sous le capot. –