Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

138
Visualizações
Acceda a los miembros de la clase abstracta de las herencias de los niños.

Tengo una clase abstracta llamada Flight y su implementa una interfaz llamada IFlight y tiene un método virtual, otras tres clases que heredan de ella, la única diferencia entre esas tres clases es la implementación de este método. Otra cosa que quiero hacer es implementar un método que acepte como argumento un objeto de tipo IFlight (podría ser una de esas tres clases) y desde ellos quiero acceder a los miembros de la clase abstracta (Flight). ¿Qué camino hay para implementar tal cosa?

Vuelo:

 class AbsFlight: IFlight { public int ID { get; set; } public string Start_Point { get; set; } public virtual float Calculate_Price(float Base_Price) { return Base_Price; } }

Una de las clases (las otras dos se ven similares excepto el método "Calcular_Precio"):

 class Charter: AbsFlight { public override float Calculate_Price(float Base_Price) { return base.Calculate_Price(Base_Price) * 3; } }

Principal:

 private static void Some_Method(IFlight flight) { Console.WriteLine(flight.Calculate_Price(2)); //OK Console.WriteLine(flight.ID); //Error } static void Main(string[] args) { List<IFlight> flights = new List<IFlight>(); flights.Add(new Regular()); flights.Add(new Charter()); flights.Add(new LowCost()); Main_SomeMethod(flights[0]); }
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Su método debe aceptar el tipo que tiene las propiedades que necesita, en este caso, la clase AbsFlight .

 private static void Some_Method(AbsFlight flight) { Console.WriteLine(flight.Calculate_Price(2)); Console.WriteLine(flight.ID); //OK }

Pero digamos que el método debe aceptar cualquier IFlight . En este caso, no puede estar seguro de haber recibido un AbsFlight; tiene que comprobar. Después de la verificación, solo puedes lanzar.

 private static void Some_Method(IFlight flight) { Console.WriteLine(flight.Calculate_Price(2)); if (flight is AbsFlight) { Console.WriteLine(((AbsFlight)flight).ID); //OK } }

Con c # 7, hay una construcción adicional que puede usar, si cree que es más clara:

 private static void Some_Method(IFlight flight) { Console.WriteLine(flight.Calculate_Price(2)); switch (flight) { case AbsFlight absFlight: Console.WriteLine(absFlight.ID); //OK break; } }
over 4 years ago · Santiago Trujillo Relatório

0

Su solución actual, en combinación con algunas de las sugerencias, será el caso de un jinete a caballo . No necesita una interfaz y una clase base y pruebas de tipo.

Puede resolver su problema de la forma en que lo intenta, con una clase base y una interfaz. Pero es excesivo, y tienes que duplicar algunas cosas en la interfaz y la clase base.

Puede resolver su problema con una clase base simple y tres clases derivadas donde solo se anula Calculate_Price. Coloque los elementos comunes en la clase base. Esta es una solución muy simple, fácil de entender, especialmente si C# y OOP son nuevos para usted.

También puede resolver su problema con una interfaz y tres clases, no derivadas. Esto tiene la desventaja de que debe implementar la interfaz en tres clases. Como señala Peter Csala, C# 8 tiene algunas funciones de lenguaje que pueden ayudar a minimizar este trabajo, posiblemente haciendo que sea tan simple como usar solo una clase base y ninguna interfaz. No estoy muy familiarizado con esas características, así que no puedo juzgar si tiene sentido.

Entonces hay otra opción completamente. Esto toca lo que insinuó zaitsman: que posiblemente se trate de un problema XY. ¿Por qué quiere distinguir entre Regular, Charter y LowCost usando clases derivadas de Flight/AbsFlight? ¿Es posible tener solo un atributo que indique qué perfil de precios se usa? ¿Hay otros campos y propiedades de un vuelo que no tienen nada que ver con el precio y, sin embargo, también distinguen los vuelos? Tal vez solo use una clase.

Acerca de las pruebas para el tipo de clase. Esto es lo que llamamos olor a código. Generalmente, si prueba mucho los tipos de clase, entonces desafía el propósito de usar clases y/o interfaces en primer lugar.

over 4 years ago · Santiago Trujillo Relatório

0

Parece ser que estás haciendo algo mal que este es tu requisito.

Cuando usa una interfaz y la pasa como argumento, quiere que sea común a todos los objetos que la implementan.

De todos modos, si quieres hacerlo. Podrías hacer algo como:

 if (flight is Flight) { Flight yourFlight = (Flight)flight; // Here you can use anything you need from Flight, eg: yourFlight.ID }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda