wake-up-neo.com

Abstract Class: - Real Time Beispiel

Vor kurzem wurde mir in einem Interview eine sehr allgemeine Frage gestellt: "Was ist abstrakt in Java?" Dann fragte der Interviewer schließlich nach einem Echtzeit-Beispiel, wann ich eine Klasse als abstrakt verwenden sollte. Ich wurde verwirrt. Ich gab ein Beispiel, aber er war nicht überzeugt.

Ich habe gegoogelt, aber keine wirkliche Lösung gefunden.

Kann mir jemand ein Beispiel in Echtzeit geben, d. H. Wenn er eine Klasse in seinem Projekt als abstrakt definiert hat und warum?

Vielen Dank.

23
Anuj Kumar Jha

Ein gutes Beispiel für Echtzeit aus hier : -

Ein konkretes Beispiel für eine abstrakte Klasse wäre eine Klasse mit dem Namen Tier. Sie sehen viele Tiere im wirklichen Leben, aber es gibt nur Arten von Tiere. Das heißt, Sie schauen niemals auf etwas Purpurrotes und Pelziges und sagen "Das ist ein Tier, und es gibt keine spezifischere Art, es zu definieren" . Stattdessen sieht man einen Hund oder eine Katze oder ein Schwein ... alle Tiere. Der Punkt ist, dass man nie ein Tier herumlaufen sehen kann, das nicht mehr ist speziell etwas anderes (Ente, Schwein usw.). Das Tier ist das abstrakte Klasse und Ente/Schwein/Katze sind alle Klassen, die von diesem abgeleitet sind Basisklasse. Tiere können eine Funktion namens "Age" bereitstellen, die 1 .__ hinzufügt. Jahr des Lebens zu den Tieren. Es könnte auch eine abstrakte Methode zur Verfügung gestellt werden genannt "IsDead", das, wenn es aufgerufen wird, Ihnen sagen wird, ob das Tier .__ hat. ist gestorben. Da IsDead abstrakt ist, muss jedes Tier es implementieren. Also eine Katze könnte entscheiden, dass es tot ist, nachdem es 14 Jahre alt ist, aber eine Ente könnte entscheiden, dass sie nach 5 Jahren stirbt. Die abstrakte Klasse Animal bietet die Age-Funktion für alle Klassen an, die daraus abgeleitet werden, Aber jede dieser Klassen muss IsDead selbst implementieren.

Ein Geschäft Beispiel :

Ich habe eine Persistenz-Engine, die gegen jeden Datenlieferanten funktioniert (XML, ASCII (mit Trennzeichen und fester Länge), verschiedene JDBC-Quellen (Oracle, SQL, ODBC usw.) Ich habe eine abstrakte Basisklasse erstellt, um die gemeinsame Funktionalität von In dieser Persistenz bereitzustellen. instanziieren Sie jedoch den entsprechenden "Port" (Unterklasse), wenn Sie meine Objekte beibehalten. (Dies macht die Entwicklung neuer "Ports" .__ wesentlich einfacher, da die meiste Arbeit in den Superklassen erledigt wird JDBC-Versionen: Da ich nicht Nur Persistenz, sondern andere Dinge (wie die Tabellengenerierung) mache, muss ich Die verschiedenen Unterschiede für jede Datenbank angeben.) Die besten Business-Beispiele für Interfaces sind die Sammlungen kann mit einer Java.util.List arbeiten, ohne sich darum zu kümmern, wie sie implementiert wird; die List als abstrakte Klasse ist nicht sinnvoll, da grundlegende Unterschiede in der Funktionsweise vonArrayList im Gegensatz zu LinkedList bestehen Ebenso Map und Set. Und wenn ich nur mit einer Gruppe von -Objekten arbeite und es mir egal ist, ob es sich um eine List, Map oder Set handelt, c Verwenden Sie einfach die Collection-Schnittstelle.

20
Rahul Tripathi

Hier etwas über abstrakten Unterricht ...

  1. Die abstrakte Klasse ist eine unvollständige Klasse, daher können wir sie nicht instanziieren.
  2. Wenn Methoden abstrakt sind, muss class abstrakt sein.
  3. Im abstrakten Unterricht verwenden wir sowohl abstrakte als auch konkrete Methoden.
  4. Es ist illegal, eine abstrakte und endgültige Klasse zu definieren.

Echtzeitbeispiel--

Wenn Sie ein neues Auto (WagonX) erstellen möchten, in dem alle Eigenschaften eines anderen Autos enthalten sind, z. B. Farbe, Größe, Motor usw., und Sie möchten weitere Funktionen wie das Modell baseEngine in Ihr Auto einfügen. Dann erstellen Sie einfach eine Zusammenfassung Klasse WagonX, in der Sie die vordefinierte Funktionalität abstrakt verwenden und andere Funktionen konkret sind, die von Ihnen definiert werden.
Eine weitere Unterklasse, die die abstrakte Klasse WagonX erweitert. Standardmäßig greifen Sie auch auf die abstrakten Methoden zu, die in der abstrakten Klasse instanziiert werden. SubClasses greifen auch auf die konkreten Methoden zu, indem Sie das Objekt der Unterklasse erstellen.
Zur Wiederverwendbarkeit des Codes verwenden die Entwickler meistens abstrakte Klassen.

abstract class WagonX
{
   public abstract void model();
   public abstract void color();
   public static void baseEngine()
    {
     // your logic here
    }
   public static void size()
   {
   // logic here
   }
}
class Car extends WagonX
{
public void model()
{
// logic here
}
public void color()
{
// logic here
}
}
4
vikas agrahari

Das beste Beispiel für eine abstrakte Klasse ist GenericServlet. GenericServlet ist die übergeordnete Klasse von HttpServlet. Es ist eine abstrakte Klasse. 

Wenn Sie 'GenericServlet' in eine benutzerdefinierte Servlet-Klasse übernehmen, muss die service()-Methode überschrieben werden.

3
user3187491

Sie sollten mindestens einen aus dem JDK selbst zitieren können. Schauen Sie in das Java.util.collections-Paket. Es gibt mehrere abstrakte Klassen. Sie sollten Interface, Abstrakt und Konkretes für Map verstehen und warum Joshua Bloch es so geschrieben hat.

2
duffymo

Ich verwende häufig abstrakte Klassen in Verbindung mit Template-Methode Muster .
In der abstrakten Hauptklasse habe ich das Skelett des Hauptalgorithmus geschrieben und abstrakte Methoden als Haken gemacht, an denen die Suklassen eine spezifische Implementierung vornehmen können. Ich habe oft beim Schreiben von Datenparsern (oder Prozessors) verwendet, die Daten von einem anderen Ort lesen müssen (Datei, Datenbank oder andere Quellen), einen ähnlichen Verarbeitungsschritt (möglicherweise kleine Unterschiede) und unterschiedliche Ausgaben haben.
Dieses Muster sieht aus wie Strategiemuster , aber es gibt Ihnen weniger Granularität und kann zu einem schwierigen mantainable-Code degradiert werden, wenn der Hauptcode zu stark wächst oder zu viele Ausnahmen vom Hauptfluss erforderlich sind (diese Überlegungen kamen meiner Erfahrung nach).
Nur ein kleines Beispiel:

abstract class MainProcess {
  public static class Metrics {
    int skipped;
    int processed;
    int stored;
    int error;
  }
  private Metrics metrics;
  protected abstract Iterator<Item> readObjectsFromSource();
  protected abstract boolean storeItem(Item item);
  protected Item processItem(Item item) {
    /* do something on item and return it to store, or null to skip */
    return item;
  }
  public Metrics getMetrics() {
    return metrics;
  }
  /* Main method */
  final public void process() {
    this.metrics = new Metrics();
    Iterator<Item> items = readObjectsFromSource();
    for(Item item : items) {
      metrics.processed++;
      item = processItem(item);
      if(null != item) {

        if(storeItem(item))
          metrics.stored++;
        else
          metrics.error++;
      }
      else {
        metrics.skipped++;
      }
    }
  } 
}

class ProcessFromDatabase extends MainProcess {
  ProcessFromDatabase(String query) {
    this.query = query;
  }
  protected Iterator<Item> readObjectsFromSource() {
    return sessionFactory.getCurrentSession().query(query).list();
  }
  protected boolean storeItem(Item item) {
    return sessionFactory.getCurrentSession().saveOrUpdate(item);
  }
}

Hier ein anderes Beispiel.

0