2017-12-08 3 views
0

Ich habe eine C++ - Schnittstelle mit zwei Methoden. Jede Klasse, die diese Schnittstelle implementiert, muss mindestens eine der beiden Methoden implementieren, kann aber beides definieren. Es ist jedoch nicht notwendig, beides zu definieren. Was ist das beste Muster in einer solchen Situation?Implementierung einer Schnittstelle durch eine Teilmenge seiner Methoden

+0

In welchem ​​Kontext verwenden Sie diese Klassen? Sie möchten vielleicht näher ausführen. Beachten Sie, dass die auf der Meinung der Befragten basierenden Fragen vom Thema abweichen. –

+0

Ich denke, wenn Sie möchten, dass eine Klasse Ihre Schnittstelle implementiert, müssen Sie die gesamte Schnittstelle implementieren. Möchten Sie eine allgemeine Implementierung in einer bestimmten Klasse überladen? – ponayz

+3

Teilen Sie die Schnittstelle in 2 und fügen Sie jeweils eine Methode hinzu. Klassen können jetzt eine oder beide Schnittstellen implementieren. Eine Schnittstelle sollte als ein Vertrag betrachtet werden (ich implementiere das alles). –

Antwort

0

Etwas wie folgt vor:

class MyInterface 
{ 
public: 
    virtual ~MyInterface() {} 

    virtual void foo() = 0; 
    virtual void bar() = 0; 
}; 


class MyAbstractClass : public MyInterface 
{ 
public: 
    virtual ~MyAbstractClass(); 

    // Provide implementation for foo or bar 
    virtual void foo() override { } 
    virtual void bar() override { } 
}; 

class MyNewClass : public MyAbstractClass 
{ 
    // Implement either of foo or bar or can be both 
}; 
+0

MyAbstractClass ist nicht von MyInterface geerbt. Was auch immer der Grund in MyAbstractClass ist, warum die MyInterface-Methode nicht rein virtuell, sondern virtuell gemacht wird? – ponayz

+1

@Worry verzeihen über fehlende MyInterface erben. Auch OP erwähnt _ "Ich habe eine C++ Schnittstelle mit zwei Methoden" _ so gab ich Interface Beispiel. – P0W

+0

Ich würde lieber 'foo' und' bar' in 'MyInterface' nicht rein virtuell machen mit Standardimplementierung, die etwas wie" WARN: Operation nicht unterstützt "macht. – Ptaq666

0

IMHO die Frage schon falsch ist und auch die Klasse ist es auf.

Fall A: Eine Klasse hat eine Definition für eine bestimmte Methode. Die Basisimplementierung sollte ein erwartbares Verhalten bieten. In diesem Fall steht es Ihnen frei, es zu überschreiben oder nicht.

Fall B: Die Methode ist abstrakt, also müssen Sie sie in einer erwartbaren Weise überschreiben, sonst wird der Compiler nicht kompilieren.

Es gibt keine Möglichkeit, ein "Bitte überschreiben Sie eins oder beide" in C++ zu deklarieren. Eine Klasse gegeben, die das erwartet, ist (sehr) schlechtes Design.

Also die Frage existiert nicht. Wenn es existiert, ist es nicht möglich, es mit mehr Details zu beantworten, da es vom Kontext abhängt.

Verwandte Themen