Pregunta

Estoy desarrollando una biblioteca reutilizable y han estado creando clases abstractas, por lo que el cliente puede extenderse desde éstos.

PREGUNTA: ¿Hay alguna razón en el hecho de que debe utilizar una clase abstracta que aquí en lugar de sólo una clase normal,

Nota - Ya ha decidido que no quieren usar las interfaces que quiero incluir métodos efectivos de incumplimiento en mi biblioteca por lo que el cliente utilizando no tiene que escribir el código

.

EDIT: Así que estoy pesca de cualquier ventaja que no puedo imaginar. Por ejemplo cuando se actualiza la biblioteca utilizaría de una clase abstracta disminuir el impacto sobre el código de cliente - No puedo ver que lo haría en este caso hay?

¿Fue útil?

Solución

A menos que quiera obligar a los usuarios finales a heredar de sus clases, no debería haber ninguna razón para el uso de Extracto .

Si desea hacer sus clases heredables y fácilmente extensible, el uso Virtual en sus métodos y asegúrese de que tiene utilizable protegido constructores.

Otros consejos

La motivación para la clase abstracta es exigir a los clientes para sustituir la clase. Su decisión de si la clase debe ser abstracta o no depende principalmente de si el resumen no se encuentra algún comportamiento fundamental de que sólo un usuario de la clase puede suministrar.

Por lo general, se puede decir que necesita su clase para ser abstracta si se utiliza un método de la plantilla de algún tipo, donde "tapón en el agujero de este comportamiento" completa la lógica de que la clase. Si la clase es útil sin cierta lógica proporcionada por el usuario, es probable que no necesita la clase a ser abstracta.

A modo de ejemplo, los marcos generalmente no pueden tomar decisiones en nombre de sus usuarios en términos de cosas como la validación de estado del objeto, la impresión, la pantalla, y así sucesivamente, por lo que necesitaría aplazar hasta implementaciones concretas por los clientes.

parece que estás un poco confundido sobre la diferencia entre un método virtual y una clase abstracta. No es necesario para marcar su clase como abstracta, a menos que determine que no tiene sentido por sí mismo. Esto es útil en áreas donde es posible que haya compartido entre varios comportamientos clases.

Me parece que sólo tiene una clase regular y algunos métodos que son virtuales.

La diferencia entre una clase abstracta y uno no abstracta es que no se puede crear una instancia del primero y que debe ser sobreescrito. Realmente depende de usted para determinar si es o no una instancia de la clase base tiene sentido por sí misma.

Te voy a enseñar dos casos. Una de ellas es donde la clase abstracta tiene sentido y uno en el que no lo hace.

public abstract class Animal {
  public string Name {get;set;}
}

public class Dog : Animal {
  public Bark(){}
}

public class Cat : Animal {
  public Meaow(){}
}

En este escenario tenemos un Animal base común que permite la implementación de la propiedad Name. No tiene ningún sentido a Animal instantiate por sí mismo ya que no hay animales en el mundo que son animales tan sólo, que son perros o gatos de debilitar o algo más.

Este es un caso en el que tiene sentido tener una base no abstracto.

class Path {
  public Path(IList<Point> points) {
    this.Points = new ReadOnlyCollection<Point>(points);
  }
  public ReadOnlyCollection<Point> Points {get;}
}

class RectanglePath : Path{
  public SquarePath (Point origin, int height, int width) : 
   base(new List<Point>{origin, new Point(origin.X + width, point.Y}, ....){

  }
}

Aquí camino que no es una subclase tiene sentido, podemos crear cualquier forma arbitraria, pero podría ser más conveniente utilizar un sublass para más formas específicas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top