tag que metodos metodo clases c# oop inheritance

c# - que - Cómo forzar a las sub clases a implementar un método



que es un metodo override en c# (4)

Una clase abstracta: funcionaría, pero la clase base tiene algunas funciones auxiliares útiles que algunos de los sub classe utilizan

Una clase abstracta no requiere que todas las funciones que proporciona sean abstractas.

abstract class Base { public void Foo() {} // Ordinary method public virtual void Bar() {} // Can be overridden public abstract void Xyz(); // This one *must* be overridden }

Tenga en cuenta que si reemplaza public con protected , el método marcado solo será visible para clases base y subclases.

Estoy creando una estructura de objeto y quiero que todas las subclases de la base se vean forzadas a implementar un método.

Las únicas formas en que podía pensar en hacerlo eran:

  1. Una clase abstracta: funcionaría pero la clase base tiene algunas funciones auxiliares útiles que algunas de las subclases utilizan.

  2. Una interfaz: si se aplica solo a la clase base, las subclases no tienen que implementar la función solo la clase base.

¿Esto es posible?

NB Esta es una aplicación .NET 2.


Una interfaz: si se aplica solo a la clase base, las subclases no tienen que implementar la función solo la clase base.

Esto no es del todo correcto. Si la clase base es abstracta, puede marcar los métodos que pertenecen a la interfaz como abstract y forzar la implementación en las subclases.

Eso trae una opción que no mencionaste: usar ambas. Tienes una interfaz IFoo y una clase base abstracta de FooBase la implementa, o parte de ella. Esto proporciona subclases con una implementación "predeterminada" de la interfaz (o parte de ella), y también le permite heredar de otra cosa y aún implementar la interfaz, o si desea implementar la interfaz pero no heredar la implementación de la clase base. Un ejemplo podría ayudar:

// Your interface interface IFoo { void A(); void B; } // A "default" implementation of that interface abstract class FooBase : IFoo { public abstract void A(); public void B() { Console.WriteLine("B"); } } // A class that implements IFoo by reusing FooBase partial implementation class Foo : FooBase { public override void A() { Console.WriteLine("A"); } } // This is a different class you may want to inherit from class Bar { public void C() { Console.WriteLine("C"); } } // A class that inherits from Bar and implements IFoo class FooBar : Bar, IFoo { public void A() { Console.WriteLine("Foobar.A"); } public void B() { Console.WriteLine("Foobar.B"); } }


Puede tener métodos abstractos en una clase con otros métodos implementados. La ventaja sobre una interfaz es que puede incluir algún código con su clase y obligar al nuevo objeto a completar los detalles de los métodos abstractos.

public abstract class YourClass { // Your class implementation public abstract void DoSomething(int x, int y); public void DoSomethingElse(int a, string b) { // You can implement this here } }


Sí, y si todas las clases para las que debe hacer esto son lógicamente subclases de una clase base abstracta existente, entonces agregue un método abstracto a la clase base ... Esto es mejor que una interfaz porque le permite agregar la implementación más tarde ( cambiando el método abstracto de la clase base a método virtual con una implementación predeterminada), si / cuando resulta que, digamos, ocho de diez clases derivadas tendrán la misma implementación, y digamos que solo dos de ellas difieren ...

EDITAR: (basado en el hilo en los comentarios a continuación) La clase base debe declararse como abstracta para hacer esto ... No se puede tener un método abstracto en una clase no abstracta porque se puede crear una instancia de una clase no abstracta, y si se creó una instancia de este, NO habría implementación para ese método. Entonces esto es ilegal. Al declarar la base como abstracta, inhibes la creación de instancias de la clase. Entonces, solo se pueden instanciar las clases derivadas no abstractas, donde (debido a que el método base es abstracto) DEBE agregar una implementación para ese método.