Domanda

sto sviluppando una libreria riutilizzabile e sono stati la creazione di classi astratte, in modo che il cliente può poi estendersi da questi.

DOMANDA:? C'è qualche ragione in effetti dovrei usare una classe astratta qui in contrasto con appena una classe normale

Nota - hanno già deciso che non voglio usare le interfacce come voglio includere metodi predefiniti effettivi della mia biblioteca in modo che il cliente di usarlo non è necessario scrivere il codice

.

EDIT: Così sto pesca per eventuali vantaggi non riesco a pensare. Per esempio quando si aggiorna la libreria avrebbe utilizzato di una classe astratta diminu impatto sul codice del client - Non riesco a vedere non sarebbe per nulla questo caso?

È stato utile?

Soluzione

A meno che non si vuole forzare gli utenti finali di ereditare dalle vostre classi, non ci dovrebbe essere alcun motivo per l'uso abstract .

Se si vuole fare le vostre classi ereditabili e facilmente estendibile, utilizzo virtual sui vostri metodi e assicurarsi di avere utilizzabile protetto costruttori.

Altri suggerimenti

La motivazione per la classe astratta è quello di richiedere ai clienti di sostituire la classe. La vostra decisione sul se la classe dovrebbe essere astratto o non dipende in primo luogo dal fatto che l'astratto manca un comportamento fondamentale che solo un utente della classe in grado di fornire.

di solito si può dire è necessario il classe per essere estratto se si utilizza un metodo di modello di qualche tipo, dove "la spina nel foro in questo comportamento" completa la logica che di classe. Se la classe è utile senza una certa logica fornito dall'utente, probabilmente non è necessario la classe di essere astratta.

Per fare un esempio, i quadri di solito non può prendere decisioni per conto dei propri utenti in termini di cose come validazione oggetto di stato, la stampa, visualizzazione, e così via, e che avrebbero bisogno di rinviare alle implementazioni concreti dai clienti.

Sembra che si sta un po 'confuso circa la differenza tra un metodo virtuale e una classe astratta. Non è necessario contrassegnare la classe come astratta a meno che non si stabilisce che essa non ha senso su di essa la propria. Questo è utile in aree in cui si potrebbe avere condiviso i comportamenti tra più classi.

Suoni a me come si solo bisogno di una classe normale e alcuni metodi che sono virtuale.

La differenza tra una classe astratta e uno non astratta è che non è possibile creare un'istanza della ex e deve essere ignorato. E 'davvero a voi per determinare se un'istanza della classe base ha un senso per conto suo.

Mi permetta di mostrare due casi. Uno è dove la classe astratta ha un senso e uno in cui non è così.

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

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

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

In questo scenario abbiamo un Animal base comune che fornisce implementazione per la proprietà Name. Non ha senso per Animal instantiate da solo come non ci sono animali in tutto il mondo che sono solo animali, sono cani o gatti Wither o qualcos'altro.

Ecco un caso in cui ha senso avere una base non astratta.

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}, ....){

  }
}

Qui percorso che non è una sottoclasse ha un senso, possiamo creare qualsiasi forma arbitraria, ma potrebbe essere più conveniente usare un sublass per ulteriori forme specifiche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top