Sólo el resumen de 5 minutos sería bueno ....favor explicar la utilidad de los métodos abstractos en C#
Respuesta
public abstract class Request
{
// each request has its own approval algorithm. Each has to implement this method
public abstract void Approve();
// refuse algorithm is common for all requests
public void Refuse() { }
// static helper
public static void CheckDelete(string status) { }
// common property. Used as a comment for any operation against a request
public string Description { get; set; }
// hard-coded dictionary of css classes for server-side markup decoration
public static IDictionary<string, string> CssStatusDictionary
}
public class RequestIn : Request
{
public override void Approve() { }
}
public class RequestOut : Request
{
public override void Approve() { }
}
¿Por qué lo haces como un método abstracto en lugar de como una interfaz? ¿Es solo más ligero si solo tienes un par de cosas implementando la Solicitud? –
¿Cómo es este un ejemplo del mundo real? – Oded
Una clase abstracta puede implementar métodos, por lo que podría tener algún comportamiento predeterminado allí al que un descendiente llamaría ... no puede hacer esto con una interfaz. –
lo utilizó para una versión casera de Tetris, donde cada tipo tetraminos era una clase hija de la clase tetramino.
Es posible utilizar un método abstracto (en lugar de una interfaz) cada vez que tenga una clase base que en realidad contiene algún código aplicación, pero no hay ninguna aplicación por defecto razonable para uno o más de sus métodos:
public class ConnectionFactoryBase {
// This is an actual implementation that's shared by subclasses,
// which is why we don't want an interface
public string ConnectionString { get; set; }
// Subclasses will provide database-specific implementations,
// but there's nothing the base class can provide
public abstract IDbConnection GetConnection() {}
}
public class SqlConnectionFactory {
public override IDbConnection GetConnection() {
return new SqlConnection(this.ConnectionString);
}
}
Basta con mirar el Template Method Pattern.
Por ejemplo, supongamos que tiene algunas clases que corresponden a filas en su base de datos. Es posible que desee que estas clases se consideren iguales cuando su ID sea igual, porque así es como funciona la base de datos. De modo que podría hacer el ID abstracto porque eso le permitiría escribir código que usa el ID, pero no implementarlo antes de que conozca el ID en las clases concretas. De esta forma, evitas implementar el mismo método equals en todas las clases de entidad.
public abstract class AbstractEntity<TId>
{
public abstract TId Id { get; }
public override void Equals(object other)
{
if (ReferenceEquals(other,null))
return false;
if (other.GetType() != GetType())
return false;
var otherEntity = (AbstractEntity<TId>)other;
return Id.Equals(otherEntity.Id);
}
}
No soy un tipo C#. ¿Te importa si uso Java? El principio es el mismo. Usé este concepto en un juego. Calculo el valor de armadura de diferentes monstruos de manera muy diferente. Supongo que podría hacerles un seguimiento de varias constantes, pero esto es mucho más fácil conceptualmente.
abstract class Monster {
int armorValue();
}
public class Goblin extends Monster {
int armorValue() {
return this.level*10;
}
}
public class Golem extends Monster {
int armorValue() {
return this.level*this.level*20 + enraged ? 100 : 50;
}
}
Tal como está escrito, su ejemplo proporciona una justificación para usar una interfaz, pero no justifica el uso de una clase abstracta. – Brian
Supongo que podría haber puesto 20 líneas más de código para hacerlo más detallado. También veo cómo podría haber usado una interfaz como Attackable que tendría (entre otros) armorValue() como miembro. Sin embargo, todavía siento que esto ilustra bastante bien el punto: tanto Goblins como Golems tienen un valor de armadura, pero debe calcularse de manera diferente. – corsiKa
El uso del método abstracto es muy común cuando se utiliza el Template Method Pattern. Puede usarlo para definir el esqueleto de un algoritmo y hacer que las subclases modifiquen o refinen ciertos pasos del algoritmo, sin modificar su estructura.
Eche un vistazo a un ejemplo del "mundo real" de doFactory's Template Method Pattern page.
public abstract class MyBaseController {
public void Authenticate() { var r = GetRepository(); }
public abstract void GetRepository();
}
public class ApplicationSpecificController {
public override void GetRepository() { /*get the specific repo here*/ }
}
Esto es sólo un código ficticio que representa un cierto código del mundo real que tengo (por brevedad esto es sólo código de ejemplo)
tengo 2 aplicaciones ASP MVC que hacen cosas bastante similares. La lógica de seguridad/sesión (junto con otras cosas) ocurre igual en ambos. He abstraído la funcionalidad base de ambas en una nueva biblioteca que ambas heredan. Cuando la clase base necesita elementos que solo se pueden obtener a partir de la implementación real, los implemento como métodos abstractos. Entonces, en mi ejemplo anterior, necesito extraer información del usuario de un DB para realizar la autenticación en la biblioteca base. Para obtener la base de datos correcta para la aplicación, tengo un método abstracto GetRepository
que devuelve el repositorio de la aplicación. Desde aquí, la base puede llamar a algún método en el repositorio para obtener información del usuario y continuar con la validación, o lo que sea.
Cuando se necesita realizar un cambio en la autenticación, ahora solo necesito actualizar una lib en lugar de duplicar esfuerzos en ambas. En resumen, si desea implementar algunas funcionalidades, pero no todas, una clase abstracta funciona muy bien. Si no quiere implementar ninguna funcionalidad, use una interfaz.
Las dos últimas oraciones son doradas. :) – GalacticCowboy
Ese fue un gran ejemplo – Vamsi
Las clases .NET Stream son un buen ejemplo. La clase Stream incluye la funcionalidad básica que implementan todas las secuencias y, a continuación, las secuencias específicas proporcionan implementaciones específicas para la interacción real con E/S.
La idea básica es tener la clase abstracta para proporcionar el esqueleto y la funcionalidad básica y simplemente dejar que la implementación concreta proporcione los detalles exactos necesarios.
Supongamos que tiene una interfaz con ... +20 métodos, por ejemplo, una interfaz de lista.
List {interface }
+ add(object: Object)
+ add(index:Int, object: Object)
+ contains(object: Object): Bool
+ get(index : Int): Object
+ size() : Int
....
Si alguien necesita proporcionar una implementación para esa lista, debe implementar los métodos +20 todo el tiempo.
Una alternativa sería tener una clase abstracta que implemente la mayoría de los métodos y simplemente dejar que el desarrollador implemente algunos de ellos.
Por ejemplo
Implementar una lista no modificable, el programador sólo necesita extender esta clase y proporcionar implementaciones para el get (int index) y size()
AbstractList: List
+ get(index: Int) : Object { abstract }
+ size() : Int { abstract }
... rest of the methods already implemented by abstract list
En esta situación: get
y size
son métodos abstractos que el desarrollador debe implementar. El resto de la funcionalidad ya puede estar implementada.
EmptyList: AbstractList
{
public overrride Object Get(int index)
{
return this;
}
public override int Size()
{
return 0;
}
}
Si bien esta aplicación puede parecer absurdo, sería útil para inicializar una variable:
List list = new EmptyList();
foreach(Object o: in list) {
}
para evitar punteros nulos.
Un ejemplo
namespace My.Web.UI
{
public abstract class CustomControl : CompositeControl
{
// ...
public abstract void Initialize();
protected override void CreateChildControls()
{
base.CreateChildControls();
// Anything custom
this.Initialize();
}
}
}
- 1. favor explicar la diferencia
- 2. métodos abstractos estáticos en C++
- 3. ¿Los métodos abstractos son virtuales?
- 4. Métodos abstractos en Python
- 5. Métodos de utilidad en el objetivo-c
- 6. C# métodos estáticos virtuales (o abstractos)
- 7. Anulación de los rasgos y los métodos abstractos en Scala
- 8. ¿Podría alguien explicar __declspec (desnudo) por favor?
- 9. Clase abstracta sin métodos abstractos
- 10. favor explicar el significado de la siguiente conversión
- 11. favor explicar acerca de Func delegado en .NET 4.0
- 12. ¿Implementando métodos abstractos en tiempo de ejecución?
- 13. Comparación: métodos de interfaz vs métodos virtuales vs métodos abstractos
- 14. Visibilidad estándar para métodos abstractos
- 15. Clases y métodos abstractos en Java, Herencia
- 16. métodos abstractos en una interfaz Java
- 17. Alcance de la utilidad de la interfaz en java
- 18. Unidad de Pruebas: explicar la utilidad de Mock Objects
- 19. métodos abstractos internos. ¿Por qué alguien los tendría?
- 20. Por favor, explique los métodos de extensión para mí
- 21. ¿Por qué los métodos de interfaz C# no se declaran abstractos o virtuales?
- 22. Java: ¿cómo implementar métodos abstractos privados?
- 23. ¿Cómo declaras valores y métodos de objetos abstractos en scala?
- 24. Campos virtuales/abstractos en C#
- 25. Cómo implementar automáticamente métodos abstractos heredados en Delphi XE
- 26. Learning Haskell: Programa aparentemente circular - Por favor ayuda a explicar
- 27. Cambiar las firmas de métodos abstractos en las clases heredadas
- 28. ¿Qué son los métodos anónimos en C#?
- 29. Utilidad de const (C++)
- 30. favor explicar esto elimina la parte superior de sintaxis SQL 100
Esto no parece cumplir los requisitos de 'no es una cuestión real'. –
No hay razón para cerrar esta pregunta. Si bien no es prolijo, la pregunta es exacta y no ambigua. –
Umm cerrando esto fue un poco duro. –