Frage

Ich versuche, einen Stapel in Java zu implementieren (mit der Liste Schnittstelle: Schnittstellenliste ).

Ich möchte es zwei verschiedene Arten realisieren: mit Zusammensetzung und Vererbung.

Für Vererbung, so weit ich habe:

 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;

 public class StackInheritance implements List {
      //implement list methods
 }

Für Zusammensetzung, die ich habe:

 import java.util.List;

 public abstract class StackComposition implements List {
     // implement some standard methods
 }

 public class StackViaList extends StackComposition {
     // implement methods that have not been implemented in the abstract
     // class
 }

Ich bin verwirrt, wohin man von hier zu gehen. Ich habe noch nie eine Schnittstelle verwendet, so soll ich die Liste Methoden verwenden, um „nachahmen“ einen Stapel, einen Array oder einen Arraylist zum Beispiel mit?

Auch für Komposition, verstehe ich nicht, welche Methoden in StackComposition gehen sollte und was in StackViaList gehen sollte. Zwischen nicht voll Verständnis Schnittstellen sowie Vererbung und Komposition, ich bin ein wenig verloren. Ich kann nicht einfach scheinen „get it“ noch ...

Jede Hilfe würde geschätzt, danke!

War es hilfreich?

Lösung

Für Zusammensetzung sollte der Stapel Klasse eine Liste hat, nicht implementieren oder eine List-basierte Klasse erweitern. Vererbung ist ein "IS A" Beziehung, während Zusammensetzung a "hat eine" Beziehung.

Zum Beispiel:

public class StackWithComposition
{
    // StackWithComposition HAS A List (rather than IS A List)
    private List myList = new ArrayList();

    public void push(object item)
    {
        // add item to myList, etc.
    }

    public object pop()
    {
        // return item at top (or end) of myList
    }

    // etc.
}

Beachten Sie, dass Sie würde wahrscheinlich das eine generische Klasse machen wollen, anstatt mit rohen Objekten zu tun, aber dies würde die Idee.

In diesem Fall wird die Zusammensetzung basierte Lösung ist wahrscheinlich vorzuziehen, das Erbe-basierte Lösung. Wenn Sie von einer Klasse / Schnittstelle erben, sollten Sie sich fragen, ist der Stapel eine Liste? Die meisten Stacks sollen den Anwender Zugriff auf all rohe Liste Methoden nicht bieten, so ist es besser, das Gesicht zu verbergen, dass Sie eine Liste wie die interne Datenstruktur verwenden. eine erstellte Liste ermöglicht es Ihnen, vollständig die Tatsache zu verbergen, dass Sie eine Liste wie die interne Struktur verwenden.

Andere Tipps

Ich glaube nicht, dies eine Frage ist. Dies ist eine „können Sie tun, um meine Hausaufgaben für mich“ Frage.

Weitere sinnvolle Fragen seien:

  • Was ist der Unterschied zwischen Vererbung und Komposition?
  • Was sind die Vorteile / Nachteile eines Stapels mit jeder Implementierung?
  • Was ist ein Stapel?

Andy gab gute Antworten auf alle drei.

Leider ist es sieht aus wie die Lehrer ursprüngliche Plakat nicht die Konzepte versteht sich sehr gut, da die Zuordnung unsinnig ist. Eine Klasse, die ein java.util.List implementiert ist kein Stapel, oder besser gesagt, ist es nicht sicher als Stapel zu verwenden, weil es erfordert, dass nicht-Stack-sicheren Betrieb öffentlich. Ein Stapel eine eher Begrenzungs Schnittstelle als eine Liste.

Kein Wunder, das ursprüngliche Plakat verwechselt wird.

Sie haben die Konzepte den Kopf.

Vererbung , wie das Wort sagt, ist, wenn Sie „nehmen“ aus einem bestehenden Objekt der Funktionalität. Dies ist bekannt als IS-A-Beziehung. Zum Beispiel kann ein LKW IS-A Fahrzeug.

In Ihrer ersten Probe, die nicht Erbe ist, weil man nichts nehmen von der Liste. In Ihrem Beispiel sind Sie „Implementierung“, dass die Liste nicht „extending“ es.

Zusammensetzung ist, wenn Sie ein Objekt mit anderen bauen (Sie kombinieren Objekte). Dies ist bekannt als HAS-A-Beziehung. Zum Beispiel kann ein LKW HAS-A Rad (ist aber kein Rad). In Ihrer Probe sind Sie „erstreckt“ (vererben) von anderem Objekt

Schließlich Schnittstelle in OOP ist der "Vertrag" ein Objekt verpflichtet ist, zu erfüllen. Welche Funktionen oder Nachrichten ein Objekt reagiert.

In Java „Schnittstelle“ ist auch ein Artefakt, wo die Methoden ein Objekt definiert werden reagieren.

Also, für einen Stapel würden Sie die Methoden ein Stapel hat (die Schnittstelle)

definieren müssen
public interface Stack {
     public void push( Object o );
     public Object pop();
}

Dann mit Erbe Sie die Stack-Implementierung erstellen können. Dazu musst du verlängern (oder erbt) Funktionalität von anderer Klasse. Lassen Sie uns sagen Arraylist

 /**
  * Sample stack implementation using inheritance
  */
public class ArrayListStack extends ArrayList implements Stack {
// you use the keyword extends because you're inheriting from ArrayList
// and the keyword implements because you claim to respond to push and pop methods.

     public void push( Object o ) {
          this.add( o ); // add inherited from ArrayList
     }
     public Object pop() {
         return this.remove( this.size() -1 ); // remove inherited from ArrayList
     }
}

Da Sie „erben“ von Arraylist sind, die meisten das, was Sie brauchen, ist schon da. Aber tut dies stellt ein IS-A relatioship? Stimmt es, dass ein Stapel-An Arraylist immer?

Um den Stapel zu implementieren mit Zusammensetzung Sie müssen das Objekt mit einem anderen „kombinieren“.

  /**
   * Sample stack implementation using composition
   */ 
 public class ComposedStack  implements Stack {
      // you didn't extend anything here

      // But you'll need another object to help you 
      // to do the work.
      private ArrayList holder = .... // Should be declared as List holder = ....


    public void push( Object o ) {
         this.holder.add( o );
    }

    public Object pop() {
        return this.holder.remove( this.holder.size() -1 );
    }
 }

Die Umsetzung ist sehr ähnlich, Sie „Hinzufügen“ und „Entfernen“ Methoden aus der Arraylist verwenden

Der Unterschied ist die im ersten Fall mit Erbe Sie sind nicht nur mit diesen beiden Methoden, aber Sie sind Kopplung Ihr Objekt vollständig an die Arraylist selbst (weil Sie auch alle anderen Methoden erben haben und Attribut die Arraylist hat)

Wenn Sie Zusammensetzung , Sie koppeln nicht Ihr Objekt in die Arraylist (oder die Kupplung ist gering, was eine gute Sache ist) Sie sind einfach ein anderes Objekt mit Ihnen helfen, das zu tun Arbeit. In diesem Fall war es eine Arraylist.

Von außen (mit Komposition), Sie nicht sehen, gibt es eine Arraylist, das ist Verbergen von Informationen. Der Benutzer (Client) der Klasse sieht nur zwei Methoden zur Verfügung, „Push“ und „Pop“ und es gibt nichts mehr, das mit Ihrer Klasse getan werden könnte. Es sieht aus wie ein "echter" Stack.

Mit Vererbung (mit Schlüsselwort extends), der Client der Klasse zu sehen ist alles, auch die Methoden von

class stack
{

    int n,item,top;
    public stack()
    {
        n=7;
        top=-1;
    }}
    class student extends stack
    {
    int [] stk=new int[4];
    public void insert(int a)
    {
        if(top>=n-1)
        System.out.println("over flow");
        else
        {
            top++;
            stk[top]=a;
        }   
    }
        public void deletestk()
    {
        if(top<0)
            System.out.println("under flow");
            else
            {
                item=stk[top];
                top--;
                    System.out.println("deleted item are"+item);
            }
    }
        public void destroy()
    {
        if(top<0)
            System.out.println("under flow");
            else
            {

            top=-1;
    }
    }
    public void view()
    {
        int i;
        i=top;
        while(i>=0)
        {
                System.out.println(stk[i]);
                i--;
        }
    }   

    }
    class stackfloat extends stack
    {

        float [] stk=new float[6];
    }
    class stkstring extends stack
    {
        String [] stk=new String[5];
    }
    class stackmain
{
    public static void main(String arg[])
    {
        stack ob=new stack();
        student obj=new student();
            obj.deletestk();
        obj.insert(5);
            obj.insert(6);
                obj.insert(64);
                    obj.insert(45);
                        obj.insert(3);
                        obj.view();
                        obj.deletestk();
                        obj.view();
                        obj.destroy();
                        obj.view();



    }
}
scroll top