programacion - polimorfismo parametrico c#
Intentando heredar tres clases base y no puedo (7)
C # no admite la herencia múltiple.
En el primer ejemplo, está heredando de ProfileBase
y declarando que su clase está implementando la interfaz ISessionMgrEntry
.
Puede agregar tantas interfaces a una clase como desee (siempre que las implemente todas).
Tengo algunas preguntas relacionadas con el diseño de mi clase de User
, pero son lo suficientemente diferentes, por lo que creo que deberían ser preguntas independientes.
Entonces, el primero está relacionado con la herencia de las clases base. Actualmente estoy heredando dos clases, ProfileBase
e ISessionMgrEntry
como tales:
public class User : ProfileBase, ISessionMgrEntry
Pero, también quiero heredar una tercera clase, MembershipUser
, como esto:
public class User : ProfileBase, MembershipUser, ISessionMgrEntry
Sin embargo, el compilador no me deja hacer eso. ¿Por qué? ¿Y cómo me las arreglo?
Gracias.
PS - ASP.NET 3.5 / C #
EDITAR
Hola. Creo que la solución a continuación puede funcionar para lo que estoy tratando de lograr. Parece bastante simple y directo. Estoy haciendo esto para poder crear un objeto User
completo / combinado. ¿Alguien ve alguna razón por la que esto pueda causar problemas? Una que surgió mientras estaba tocando esto es la superposición de propiedades. Por ejemplo, tanto MembershipUser
como ProfileBase
comparten " UserName
". ¿Debería elegir uno u otro o será un defecto de diseño? Sugerencias? Gracias de nuevo.
public class User
{
#region Constructors
private readonly MembershipUser _MembershipUser;
private readonly ProfileBase _ProfileBase;
#endregion
public User()
{
_MembershipUser = new MembershipUser();
_ProfileBase = new ProfileBase();
}
public string Comment
{
get { return _MembershipUser.Comment as string; }
set { _MembershipUser.Comment = value; }
}
public bool IsAnonymous
{
get { return _ProfileBase.IsAnonymous as bool; }
}
....
}
C # no permite la herencia múltiple .
C # solo permite herencia simple: solo se puede heredar de una clase base. En el primer caso, ISessionMgrEntry
es una interfaz que es diferente de una clase base. Aquí hay un buen artículo sobre la diferencia: http://msdn.microsoft.com/en-us/library/ms973861.aspx
En el segundo caso, está intentando heredar de ProfileBase
y MembershipUser
, que el compilador no permitirá. La mejor manera de evitar esto sería encapsular uno (o ambos) de ProfileBase
y MembershipUser
.
C # solo soporta herencia simple. Puede encadenar sus clases (es decir, MembershipUser
hereda de ProfileBase
) o usar interfaces
.
En el primer ejemplo, en realidad no está heredando de dos clases, sino de una clase y una interfaz.
C # no permite la herencia múltiple de clases, pero le permite implementar múltiples interfaces. Consulte esta publicación del blog de MSDN para obtener más información sobre por qué.
Deberá crear una interfaz IMembershipUser
e implementarla en su clase de User
.
Las interfaces generalmente reciben nombres basados en el nombre de la clase concreta prefijada por una I
Así que la clase MembershipUser
tendría una interfaz IMembershipUser
. No hay nada que le impida usar otro nombre, pero todos los que usan interfaces están acostumbrados a esta convención de nomenclatura.
Múltiples interfaces con nombres de miembros idénticos no son un problema. Si los miembros pueden compartir la misma implementación, simplemente cree un miembro público con el mismo nombre; Si no pueden compartir la misma implementación, solo puede implementar explícitamente uno (o todos) de los miembros.
Por ejemplo, IEnumerable<T>
hereda IEnumerable
, y ambos proporcionan un método GetEnumerator()
con diferentes tipos de retorno. En consecuencia, IEnumerable.GetEnumerator()
generalmente se implementa explícitamente:
class Foo : IEnumerable<object>{
// explicitly implement IEnumerable.GetEnumerator()
IEnumerator IEnumerable.GetEnumerator ()
{
return GetEnumerator();
}
public IEnumerator<object> GetEnumerator ()
{
yield break;
}
}
Llamar a GetEnumerator()
en IEnumerable.GetEnumerator()
no es una llamada infinitamente recursiva; llama al miembro público del mismo nombre, no a sí mismo (es decir, el método IEnumerable.GetEnumerator()
).
en c # solo puede heredar de una clase , pero implemente tantas interfaces como desee. en su caso, ProfileBase
y MembershipUser
son clases e ISessionMgrEntry
es una interfaz.