Instancja klasy abstrakcyjnej.

0

Mam w programie taką oto klasę abstrakcyjną:

abstract class MySwingWorker<T, V> extends SwingWorker<T, V>
{
public final void myPublish(V... args)
{
publish(args);
}
}

A potem wewnątrz klasy głównej programu mam takie coś:

MySwingWorker worker;

Kompilator nie protestuje. Dlaczego? Podobno nie można utworzyć obiektu klasy abstrakcyjnej...

P.S. Program zawiera implementacje odziedziczonych po SwingWorker metod np. doInBackground, process, done.

0

A czemu ma protestować. Przeciez nigdzie nie tworzysz obiektu tej klasy..... To tak jakby protestował, że do ArrayList odnosisz sie przez interfejs List

0

MySwingWorker worker; to referencja. Niezainicjalizowana (czyli nic tam nie ma).
Instancję tworzysz przez new i "przypisujesz" do jakiejś referencji.

To by się nie udało

MySwingWorker worker = new MySwingWorker();
0
jarekr000000 napisał(a):

MySwingWorker worker; to referencja. Niezainicjalizowana (czyli nic tam nie ma).
Instancję tworzysz przez new i "przypisujesz" do jakiejś referencji.

To by się nie udało

MySwingWorker worker = new MySwingWorker();

Dzięki wszystkim. Faktycznie dopóki nie ma new obiekt nie istnieje - powinienem to wiedzieć.

Ostanie pytanie.
Dlaczego udaje się to? (niżej fragment)
Czy dlatego, że MySwingWorker ma tutaj kompletną implementację?

  worker = new MySwingWorker<Void, Integer>()
  {
     @Override
     protected Void doInBackground()
     {
        TextArea.append("Performing checks...\r\n");
        CheckEntryAndStay();
        TextArea.append("Processing terminated\r\n");

        return null;
     }
1

Tak, dokładnie . To jest "anonimowa" implementacja MySwingWorker, gdzie (jedyna, jak z tego wynika) abstrakcyjna metoda doInBackground została zaimplementowana.

0

Dzięki. Z mojej strony EOT.

1 użytkowników online, w tym zalogowanych: 0, gości: 1