es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo implementar una interfaz que contiene otra interfaz?

Tengo dos interfaces:

public interface IPerson
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ILocation LocationOfBirth { get; set; }
}

public interface ILocation
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

Ahora quiero implementarlas de la siguiente manera:

public class Location : ILocation
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public class Person : IPerson
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Location LocationOfBirth { get; set; }
}

Pero C# está molesto conmigo:

La propiedad ‘LocationOfBirth’ no puede implementar la propiedad de la interfaz ‘IPerson’. El tipo debe ser ‘ILocation’.

¿Por qué sucede esto cuando Location cumple con todos los requisitos de ILocation?

Quiero usar Person como modelo para EntityFramework, así que no puedo usar ILocation. ¿Qué debo hacer?


Editar: En mi aplicación, las implementaciones de las interfaces no están dentro del ámbito de las interfaces, por lo que no puedo definir IPerson con la implementación de Location.

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que C# está enojado es porque la clase Person no está implementando correctamente la interfaz IPerson. La interfaz IPerson tiene una propiedad de tipo ILocation, pero en la clase Person, la propiedad LocationOfBirth es de tipo Location, no ILocation. Por lo tanto, la clase Person debería definir la propiedad LocationOfBirth como tipo ILocation en lugar de Location. Debería ser de la siguiente manera:

    public class Person : IPerson
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public ILocation LocationOfBirth { get; set; }
    }
    

    Para resolver el problema con Entity Framework, puedes crear una clase DTO (Objeto de Transferencia de Datos) separada que implemente IPerson con la propiedad Location de tipo Location. Luego, puedes mapear el DTO a la entidad Person al recuperar o actualizar datos desde la base de datos. De esta manera, puedes utilizar la clase Person con EF mientras se mantiene la implementación correcta de la interfaz.

Comments are closed.