[VC++ 2005] Klassenableitung

the incredible Leitman

Erfahrenes Mitglied
Hallo zusammen :D

Ich habe ein eher allgemeines Problem im Bereich OOP in VC++

Habe eine Basisklasse erstellt, von der andere Klassen erben und zusätzliche Funktionen bekommen,
Nun möchte ich aber eine Klasse erstellen, wie den Großteil der Funktionen und Eigenschaften meiner Basisklasse erbt, aber eben nicht alles...
Kann ich irgendwie einige Members und Methoden sperren lassen?

z.B. habe ich in meiner Basisklasse eine Enum "Status"
Es gibt 12 verschiedene Staten in allen Klassen, außer in der, die ich jetzt schreiben möchte, die hat nur 4 unterschiedliche...
Kann ich das Enum überschreiben? --> wie?
Oder kann ich irgendwie sagen, dass nur die 4 bestimmten State die ich benötige, die anderen aber nicht meiner Klasse zur Verfügung stehen?!

Ich habe mir auch überlegt, ob ich nicht einfach eine Klasse dazwischen erstelle,
also dass ich in der Basisklasse einige Dinge entferne (dass ich wirklich nur das habe, was alle Klassen besitzen) und eine zweite Basis Klasse erstelle, die von der jetztigen Basisklasse ableitet?
Aber zahlt sich das aus, wegen einer Klasse?!

Vl könnt ihr mir Tipps geben wie ich das lösen kann, oder andere Vorschläge auftischen, weiß nicht was am Anständigsten wäre

mfG

Leitman
 
Du kannst Deine Methoden einfach überschreiben, indem Du sie in der neuen Klasse redefinierst.

Ist vielleicht nicht so schön, aber dennoch praktikabel.
 
Navy hat gesagt.:
Du kannst Deine Methoden einfach überschreiben, indem Du sie in der neuen Klasse redefinierst.

Ist vielleicht nicht so schön, aber dennoch praktikabel.

praktikabel ;) *lol*

Ja, dass ich Methoden oder Properties überschreiben kann, weiß ich,
aber in dem Fall wären die Methoden die ich bräuchte eh dieselben, jedoch nur mit z.B. anderen Staten... kann ich private Members auch einfach redefinieren?

Zur Erläuterung:
Basisklasse:
C++:
enum class DrawState
			{
				thin = 0, // thin
				straightBold = 1, // straight line bold
				bendBold = 2, // bend bold
				allBold = 3, // all bold
				thinLockedColored = 4, // Element locked colored @ state 1
				straightBoldLockedColored = 5, // Element locked colored @ state 2
				bendBoldLockedColored = 6, // Element locked colored @ state 3
				allBoldLockedColored = 7, // Element locked colored @ state 4
				thinLockedHatched = 8, // Element locked hatched @ state 1
				straightBoldLockedHatched = 9, // Element locked hatched @ state 2
				bendBoldLockedHatched = 10, // Element locked hatched @ state 3
				allBoldLockedHatched = 11,  // Element locked hatched @ state 4
				stateChanged = 12,	// Element Flank State changed
				stateChanged2 = 13 // Element FlankState changed 4 W2X2
			};
		DrawState m_drawState;

aber in meiner neuen Klasse brauche ich nur

thin und straightBold

m_drawState definiert, wie mein Control gezeichnet wird, wenn bestimmte Ereignisse passieren. Zurzeit habe ich es folgendermaßen gelöst, aber das ist nicht wirklich das Gelbe vom Ei:
C++:
		switch(this->m_drawState)
		{			
			case ZLSControls::ZLSControlBaseClass::DrawState::thin: // thin
				
				// control
				DrawControl(e,this->m_drawState);

				break;

			case ZLSControls::ZLSControlBaseClass::DrawState::straightBold: // straight bold
				
				// control
				DrawControl(e,this->m_drawState);
				
				break;

			case ZLSControls::ZLSControlBaseClass::DrawState::bendBold: // bend bold
				
				// control
				DrawControl(e,this->ZLSControls::ZLSControlBaseClass::DrawState::thin);

				break;

... usw
 
Wieso machst du das nicht OOP-gerecht? In die Basisklasse nur das rein, was auch überall benötigt wird. Dann kannst du in einer eigenen Ableitung immer noch deine Enum-Werte erweitern ...
 
Du kannst Dir evtl. noch zusätzlich einen DrawingHelper bauen der das Zeichnen übernimmt.
Somit kannst die Zeichenlogik und die Logik das Controls ansich nochmals sauber trennen...
 
@ Norbert Eder:
Ja? Wie kann ich meine Enum Werte erweitern?
Das Problem war, dass diese neue Klasse erst später dazugekommen ist, als ich den Rest schon hatte :(
Jetzt müsste ich alles überarbeiten, wenn ich die Basisklasse kürze...

@Cosmo
DrawingHelper? noch nie gehört, werd mal MSDN / Google suchen was das ist...
Aber Vorrangig ist ersteinmal die ordentliche Klassentrennung, wenn ich das habe, seh ich weiter :)

Danke euch allen für die Hilfe

mfG
Leitman
 
Christian Kusmanow hat gesagt.:
Davon Rede ich doch. Schreib deinen eigenen DrawingHelper. ;)

hm... Was meinst du damit genau?
Mein Control ruft eine Paint Methode auf, in der es sich selber zeichnet... (ich habe die ZeichenRoutine auch schon gesplittet, wie du gesagt hast, Danke nochmal, jetz ist es echt übersichtlich *gg*)

Ahja... und wie kann ich jetzt wirklich Enums erweitern? Das wäre echt voll praktisch und hilfreich!
Norbert Eder hat das zuerst erwähnt, aber ich habe nichts darüber gefunden... :-(

hätte gerne in meiner Basisklasse nur folgendes
C++:
		enum class DrawState
			{
				thin = 0, // thin
				straightBold = 1, // straight line bold
				bendBold = 2, // bend bold
				thinLockedColored = 3, // Element locked
				stateChanged = 4	// Element Flank State changed
			};
Und die anderen in den Klassen, in denen ich sie brauche...
Kann ich meine enum Klasse einfach überschreiben?

ungefähr so wie normale Klassen mit virtual ... override ?
oder wie?
 
Sooo..... wieder zurück zu den Enum Werten....

@ Norbert:
Bitte, du hast vorher (eigentlich schon länger her ^^) erwähnt, dass man die Werte der Enums nachher noch erweitern kann...
Wie genau meinst du das?
Enum Class überschreiben ? oO

Sagt mir leider absolut gar nichts, habe auch nichts gefunden, dass mir irgendwie weiterhilft -.-

Ich bräuchte nämlich in meiner ControlsSammlung überall ein Enum für die grafische Darstellung, bis auf ein Control... dieses ist nur in einer Weise darstellbar...

Zwar verwende ich dasselbe Property, jedoch wird bei den anderen Möglichkeiten das spezielle Control immer noch gleich dargestellt... ich möchte die Möglichkeit aber ganz verbieten ==> Enum override
 
Es ist nicht möglich Enumerationen zu erweitern. Das habe ich schon versucht und bin immer nur bei der Verwendung von Klassen zu denen man letztendlich statische Propertys hinzufügt angekommen. Also man sich mit Operatoren sein Enum quasi selber nachbauen muss. Das selbe habe ich zudem auch im Netz gefunden.

Warum ignoriert dein spezielles Control diesen Enumwert einfach nicht?
 

Neue Beiträge

Zurück