2016-06-30 8 views
-4

Ich habe eine Frage, die mehr oder weniger technisch ist. Ich möchte Folgendes tun:Erweitern einer Schnittstelle in einer Klasse

Haben Sie eine Klasse, die sowohl einen Standardkonstruktor als auch einen anderen Konstruktor definiert, der ein neues Objekt namens NamedRunnable erstellen wird.

Diese Klasse wird die Runnable-Schnittstelle effektiv implementieren, einschließlich der von ihr bereitgestellten run-Methode.

Ich möchte einen Weg finden, die run-Methode innerhalb der 'NamedRunnable' -Klasse selbst nicht explizit zu implementieren, sondern sie in allen Membern implementiert zu haben, die die Klasse ableiten.

Ist so etwas möglich?

+1

Es ist mir nicht ganz klar, was Sie erreichen wollen: Sie wollen einen Konstruktor, der ein Runnable und die Run-Methode benötigt, um dieses Runnable auszuführen? –

+2

kannst du uns psuedo-code zeigen, ich verstehe wirklich nicht was du willst – niceman

+0

Willst du das? public class NamedRunnable implementiert Runnable {.. public void run() {}} Es ist sicherlich möglich, – aksappy

Antwort

0

Ist dies etwas, das Sie gemeint, dann ja, es ist möglich :)

public class NamedRunnable implements Runnable { 
    public NamedRunnable(String name) { 
     // .... 
    } 

    public void run() { 
     // ..., 
    } 
} 
+0

Danke für die Antwort, aber wie in der ursprünglichen Frage erwähnt, das ist, was ich vermeiden wollte. Stattdessen habe ich die neue Klasse als abstrakt definiert und jede Klasse, die sie unterklassifiziert hat, implementiert die run-Methode. – Aris

0

Es klingt wie Sie eine abstrakte Klasse wollen (kann nicht instanziert werden), die Runnable implementiert:

abstract class NamedRunnable implements Runnable { 
    private String name; 

    protected NamedRunnable(String _name) { 
     this.name = _name; 
    } 
} 

Beachten Sie, dass das run nicht implementiert. run ist implizit abstrakt in dieser Klasse, als ob Sie

abstract public void run(); 

aufgenommen hatten ... weil wir die Schnittstelle zu erklären, aber implementiere es nicht (was würden wir nicht tun dürfen, wenn die Klasse nicht war erklärt abtract).

Sie würden, dass als Basisklasse für eine konkrete Klasse verwenden, z.B .:

class Thingy extends NamedRunnable { 
    public Thingy(String name) { 
     super(name); 
    } 

    @Override 
    public void run() { 
     // ... 
    } 
} 

Die konkrete Klasse hat die run Implementierung und instanziiert werden kann.

+1

Sie müssen nicht einmal in NamedRunnable ausführen, da es implizit ist –

+0

@NicolasFilotto: Guter Punkt. –

+0

Ich wollte eine Antwort posten, da ich genau das getan habe, was Sie gesagt haben, bevor ich die eigentliche Antwort sah, aber mit einem kleinen Unterschied, die Methode run() als abstrakte Methode in meiner abstrakten Klasse zu deklarieren. – Aris