tipos programacion polimorfismo polimorfico parametrico herencia form ejercicios clase abstracta c# inheritance multiple-inheritance

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 # 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.