Verstaendnis Problem mit OOP
-
Gruesst euch,
ich programmiere seit 4Jahren C und will jetzt ein kleines Spiel in C++ schreiben, hab aber noch Probleme mit der Umsetzung der Objekt Orientierten Programmiern. Und zwar hab ich ne Klasse InputBox, die unter anderem die Funktion "SetValidValues" bzw "SetMultiLine" implementiert. Nun moechte ich eine Klasse ableiten die IPInputBox heisst. Im prinzip die gleiche Funktionalitaet nur das man halt nicht selber die ValidValues setzten darf und MultiLine is au schmarn.
class InputBox : public IOInterface { public: /*......*/ virtual void SetValidValues(const char* pszValidValues) { SetValidValues( std::string(pszValidValues) ); }; virtual void SetMultiLine(bool bMultiLine) { m_bMultiLine = bMultiLine; }; /*.....*/ };und
class InputBoxIP : public InputBox { public: protected: virtual void SetValidValues(const std::string& strValidValues) {}; };Jetzt die Frage: waere das der richtige Weg die Funktion einfach in der abgeleiteten Klasse protected/private zu machen? Damit muesste man ja den Umweg gehen:
IPObject.InputBox::SetValidValues("blabla");um die Funktion aufzurufen. Oder sollte man da ganz anders ran gehn!?
Greetz C0de4fun
The lord gave us all life appreciate it
-
Das ist der falsche Ansatz. Wenn B von A erbt, dann bedeutet das, B ist ein A.
Konkret: Wenn
InputBoxIPvonInputBoxerbt, dann bedeutet das,InputBoxIPist eineInputBox. Wenn Du nun aberInputBoxIPFunktionalität vonInputBoxwegnimmst, dann istInputBoxIPeben keineInputBoxmehr (verhält sich nicht mehr gleich).Das bedeutet,
InputBoxIPsollte nicht vonInputBoxerben, sondern es vielleicht als Aggregat (also Member) benutzen.
-
Hmm ok ich versteh zwar was du meinst glaub ich, aber wie soll ich das dann umsetzten. Wie gesagt InputBox hat ansich alles was die InputBoxIP auch braucht nur halt die 2 Funktionen zu viel bzw sind halt da unsinnig, da man ja nur Zahl fuer die IP eingeben koennen soll und multi line is auch ein schmarn. Sollte ich dann die Funktionen die beide besitzen noch in eine ober Klasse packen z.B. IInterface und von der erben dann beide?
Ich zeig einfach mal noch mehr Code. Und zwar hier erst mal von InputBox:
void InputBox::Draw() { InitValues(); SaveConsoleState(); if( m_bBorder ) DrawBorder(); if( m_bSpace ) DrawSpace(); for( LineVec::iterator iter = m_vecLines.begin(); iter != m_vecLines.end(); iter++) { //iter->erase(); iter->resize(m_rectText.right); } CONSOLE::SetBackgroundColour(m_ColBack); CONSOLE::SetForegroundColour(m_ColText); CONSOLE::SetCursorPos( m_rectText); m_coordCurCourserPos.Y = m_rectText.top; m_coordCurCourserPos.X = m_rectText.left + m_strText.size(); std::cout << m_strText; m_bStarted = true; m_Con.RegisterInputFunc(CONSOLE::KEYBOARD, this, InputHandler); while(m_bStarted) Sleep(500); m_Con.RemoveInputFunc(InputHandler); RestoreConsoleState(); } void InputBox::InputHandler(PINPUT_RECORD pInputRec, void* pData) { InputBox* pInput = (InputBox*) pData; pInput->m_pCurInputRec = pInputRec; if( pInputRec->Event.KeyEvent.bKeyDown == 1 ) { if(pInputRec->Event.KeyEvent.wVirtualKeyCode ==pInput->m_VKNext) pInput->Next(); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKPrev) pInput->Prev(); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKScrollUp) pInput->Up_Down(true); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKScrollDown) pInput->Up_Down(false); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKClose) pInput->Close(); else if( pInputRec->Event.KeyEvent.wVirtualKeyCode == VK_BACK) pInput->Backspace(); else if( pInputRec->Event.KeyEvent.wVirtualKeyCode == VK_END) pInput->End(); else if( pInputRec->Event.KeyEvent.wVirtualKeyCode == VK_HOME) pInput->Home(); else pInput->PrintInput(); } }Und da ja die ganzen Input Funktionen wie "Up_Down" oder "Prev" virtuel sind hab ich mir gedacht ich erb einafch von InputBox ueberschreib die Funktionen das z.B. wenn man an der Position 3 ist und der Prev Key drueckt wird man zur 5. Position springt.
Ich hoff mal man versteht mein Gedankengang und ihr mir helfen koennt auf den richtigen Weg zu gelangen.
Me praise de King: King Selassie
C0de4Fun
-
InputBoxIPdarf vonInputBoxnicht öffentlich erben, wenn gewisse Methoden nicht mehr erlaubt sind. Ich würde eine Zwischenklasse einfügen, sodassInputBoxIPundInputBoxnicht mehr übereinander in der Hierarchie stehen.class InputBoxBase { // gemeinsame Schnittstelle }; class InputBox : public InputBoxBase // evtl. umbenennen { // deine beiden Funktionen }; class InputBoxIO : public InputBoxBase { // andere Dinge };Warum sind die zwei Methoden in
InputBoxüberhaupt virtuell? Überschreiben sie andere virtuelle Funktionen oder sind sie zum ersten Mal deklariert und sind dazu gedacht, von abgeleiteten Klassen überschrieben zu werden?Übrigens:
C0de4Fun schrieb:
if(pInputRec->Event.KeyEvent.wVirtualKeyCode ==pInput->m_VKNext) pInput->Next(); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKPrev) pInput->Prev(); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKScrollUp) pInput->Up_Down(true); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKScrollDown) pInput->Up_Down(false); else if(pInputRec->Event.KeyEvent.wVirtualKeyCode == pInput->m_VKClose) pInput->Close(); else if( pInputRec->Event.KeyEvent.wVirtualKeyCode == VK_BACK) pInput->Backspace(); else if( pInputRec->Event.KeyEvent.wVirtualKeyCode == VK_END) pInput->End(); else if( pInputRec->Event.KeyEvent.wVirtualKeyCode == VK_HOME) pInput->Home(); else pInput->PrintInput();Nach vier Jahren C kennst du sicher
switch. Das ist um einiges übersichtlicher und effizienter. Allerdings gibt es noch bessere Alternativen zu manuellen Fallunterscheidungen, wirf dazu einen Blick in diesen Artikel.
-
Hey ho,
joa ok dann mach ich das so, das man noch ne andere Base Klasse fuer die beiden Input Dinger hat. Danke Mr. Nexus und natuerlich auch Tachyon :).
Uebringens:
glaube dir ist vielleicht beim schnelle ueberfliegen des Codes nicht aufgefallen, dass in den if Dingern ein Paar mal Variablen vorkommen und nicht nur Konstanten und somit faellt doch switch flach ( oder geht switch in C++ auch mit Variablen!?). Und danke fuer den Artikle werd ich mir spaeter mal anguggen wenn ich wider fit bin. Is noch zu frueh
.Gruesse C0de4fun
€ noch vergessen: noe die zwei Funktionen sind zum ersten mal da und ich hab se nur virtuel gemacht damit ich wie im ersten Post in InputBoxIP die ueberschreiben kann und protected setzten kann damit der Zugriff verweigert wird
-
C0de4Fun schrieb:
glaube dir ist vielleicht beim schnelle ueberfliegen des Codes nicht aufgefallen, dass in den if Dingern ein Paar mal Variablen vorkommen und nicht nur Konstanten und somit faellt doch switch flach ( oder geht switch in C++ auch mit Variablen!?).
Seit wann geht switch nur für Konstanten?!
-
Seit wann gibt's denn C oder C++?
-
beselbube schrieb:
C0de4Fun schrieb:
glaube dir ist vielleicht beim schnelle ueberfliegen des Codes nicht aufgefallen, dass in den if Dingern ein Paar mal Variablen vorkommen und nicht nur Konstanten und somit faellt doch switch flach ( oder geht switch in C++ auch mit Variablen!?).
Seit wann geht switch nur für Konstanten?!
Seit dem das der Compiler sagt:
error C2051: case expression not constant