PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]Datenkapselung und Polymorphie


Gast
2006-04-24, 10:51:26
Hallo, könnte mir vielleicht jemand kurz diese Begriffe erklären. So ganz versteh ich das bisher nicht. Was Vererbung ist, weiß ich. Danke

Monger
2006-04-24, 11:06:58
Zum einen Thema kann ich was sagen. Was mit Datenkapselung gemeint ist, bin ich mir nicht sicher (=wrappen?!?).

Polymorphie= mehrere Gestalten. Das selbe Objekt ist -je nach Betrachter - das eine oder das andere.

Stell dir vor, ein Hund läuft durch die Straßen. Für einen Biologen läuft da ein Säugetier aus der Familie der Canidae. Für eine alte Dame läuft da ein Schmusekissen. Ein Jäger erkennt da vielleicht einen Jagdhund darin...

Ein Hund ist ein Säugetier ist ein Wirbeltier ist ein Tier ist ein Lebewesen ist ein Ding.
Das selbe "Ding" nimmt je nach Kontext auch immer verschiedene Rollen ein, ohne aber wirklich anders zu sein. Das nennt man Polymorphie.

Baalzamon
2006-04-24, 11:52:04
Datenkapselung (encapsulation, information hiding) sagt nichts anderes, als das man die Implementierungsdeatials nicht nach aussen hin sichtbar macht. Das bewerkstelligt man durch sogenannte Schnittstellen (Interfaces) welches dir für ein Objekt die Methoden mit zugehörigen Parametern bereitstellt.

Der Benutzer kennt die interne Implementierung nicht, und sie hat ihn eigentlich auch nicht zu interessiereren. Als Programmierer kann man so leicht die Eingeweide von einer Methode ändern, ohne das darauf zugreifende Elemente (Benutzer, andere Objekte) angepasst werden müssen, da sie nur die Schnitstelle kennen, nicht aber die Implementierung selbst.

Wie immer weiss Wikipedia mehr:
Datenkapselung (http://de.wikipedia.org/wiki/Datenkapselung)
Polymorphie (http://de.wikipedia.org/wiki/Polymorphie_%28Programmierung%29)

Gast
2006-04-24, 12:34:43
Polymorphie hab ich jetz noch ganz verstanden. An so Beispielen klingts ja immer ganz einfach, aber das ganze auf die Programmierung zu übertragen, is schon was anderes.

Datenkapselung hab ich bei Wikipedia schon gesehen, nur find ich, ist da immer alles so geschwollen ausgedrückt, dass einem schon beim Lesen die Lust zum kapieren vergeht.
Ist Datenkapselung also nichts anderes, als Elementvariablen private oder protectet zu deklarieren und darauf über Methoden, welche als public deklariert wurden, zuzugreifen, oder?

Matrix316@work
2006-04-24, 12:51:51
War das nicht so, dass Polymorphie nur bedeutet, dass es verschiedene Methoden mit dem gleichen Namen geben kann, die aber unterschiedlichen Klassen zugeordnet sind?

Also z.B. Klasse X beinhaltet Methode Y und Klasse Z, welche eine vererbte von Klasse X ist, beinhaltet auch Methode Y, welche aber eine andere ist als die aus X?

Oder so...;)

Ansonsten ist wikipedia bestimmt auch schlau. :)

Monger
2006-04-24, 13:01:54
Polymorphie hab ich jetz noch ganz verstanden. An so Beispielen klingts ja immer ganz einfach, aber das ganze auf die Programmierung zu übertragen, is schon was anderes.

Ich nenn dir mal ein Beispiel aus Java:

Eine ArrayList erbt von der abstrakten Oberklasse "List". "List" hat Methoden wie add, remove, get usw.
ArrayList ersetzt einige dieser Methoden mit eigenen Implementierungen. Von außen betrachtet ist das meistens aber völlig uninteressant. Alles was du bei der Verwendung siehst ist, dass es eine Liste ist. Es ist aber eben nicht nur eine Liste, sondern eine spezielle Implementierung einer Liste. Es ist sowohl das eine als auch das andere. Beides hat seine Vorteile. Je allgemeiner eine Sache ist, desto besser kann man in der Regel damit umgehen. Es ist z.B. völlig unwichtig, ob ich jetzt eine ArrayList, einen Vector oder eine LinkedList sortiere. Sortiert wird auf "List".
Polymorphie erreichst du also dadurch, indem du Methoden oder Attribute einer Oberklasse (oder eines Interfaces) überlädst, und dein Objekt dann entsprechend deklarierst.

Ist Datenkapselung also nichts anderes, als Elementvariablen private oder protectet zu deklarieren und darauf über Methoden, welche als public deklariert wurden, zuzugreifen, oder?
Im Prinzip ja. Angenommen du willst ein Objekt haben dass dir etwas auf eine ganz bestimmte Art und Weise sortiert. Nach kurzer Suche hast du in einer Bibliothek etwas gefunden, was fast genau dem entspricht was du brauchst, aber eben nur fast.
Manchmal kann oder will man aus irgendeinem Grunde nicht erben. Dann kann man diese Klasse "wrappen", und all die Methoden über eigene Methoden nach außen führen die man haben will - und eben kleine Änderungen am Verhalten machen.

Gast
2006-04-24, 13:22:31
Im Prinzip ist Polymorphie eigentlich also nichts anderes, als Vererbung mit überladenen Funktionen, oder?

Baalzamon
2006-04-24, 13:24:53
Polymorphie hab ich jetz noch ganz verstanden. An so Beispielen klingts ja immer ganz einfach, aber das ganze auf die Programmierung zu übertragen, is schon was anderes.

Datenkapselung hab ich bei Wikipedia schon gesehen, nur find ich, ist da immer alles so geschwollen ausgedrückt, dass einem schon beim Lesen die Lust zum kapieren vergeht.
Ist Datenkapselung also nichts anderes, als Elementvariablen private oder protectet zu deklarieren und darauf über Methoden, welche als public deklariert wurden, zuzugreifen, oder?

Quasi ja. Hier ein sehr triviales Beispiel mit Fakultätsfunktion:

Interface IMyMath
{
double getFac(double i);
}

Class CMyMath implements IMyMath
{
double getFac(double i)
{
// Fakultätsberechnug rekursiv
}
}

Der Benutzer kennt nur das Interface IMyMath, nicht aber die Klasse. Fällt dem Programmierer jetzt ein besserer Weg ein, die Fakultät zu berechnen, kann er einfach die Klasse ändern (eine neue Methode schreiben) das Interface bleibt aber unangetastet.

Class CMyMath implements IMyMath
{
double getFac(double i)
{
// Fakultätsberechnug durch dynamisches Programmieren
}
}


D.h. der Benutzer weiss nicht wie die Fakultät berechnet wird, und ist für ihn auch vollkommen uninteressant solange das Richtige rauskommt.

Edit: Da war doch jemand schneller :)

Gast
2006-04-24, 17:43:42
Danke, soweit hab ich alles verstanden. Leider ist bei der Polymorphie ne Frage aufgetaucht, bzw. versteh ich den Sinn von abstrakten Datentypen nicht. Alle Elementfunktionen der Basisklasse werden ja überschrieben und Elementvariablen gibt es keine. Ausserdem ist es verboten, Instanzen dieser Klasse zu erzeugen. Warum also überhaupt diese Klasse erzeugen?

Xmas
2006-04-24, 18:42:07
Danke, soweit hab ich alles verstanden. Leider ist bei der Polymorphie ne Frage aufgetaucht, bzw. versteh ich den Sinn von abstrakten Datentypen nicht. Alle Elementfunktionen der Basisklasse werden ja überschrieben und Elementvariablen gibt es keine. Ausserdem ist es verboten, Instanzen dieser Klasse zu erzeugen. Warum also überhaupt diese Klasse erzeugen?
Eine abstrakte Klasse definiert eine Schnittstelle für den Zugriff auf die Klasse. In anderen Programmiersprachen gibt es dafür das Interface-Konstrukt.

Beispiel: Auto und Yacht sind beides Fortbewegungsmittel mit denen man von einem Ort zu einem anderen gelangen kann. Sie verhalten sich dabei aber grundverschieden, es gibt keine Basisimplementation von der beide erben könnten.

Mit der abstrakten Klasse "Fortbewegungsmittel" als Basisklasse für Auto und Yacht können beide dort verwendet werden, wo einfach nur ein Fortbewegungsmittel ohne spezielle Anforderungen benötigt wird.

Monger
2006-04-24, 20:44:22
Danke, soweit hab ich alles verstanden. Leider ist bei der Polymorphie ne Frage aufgetaucht, bzw. versteh ich den Sinn von abstrakten Datentypen nicht. Alle Elementfunktionen der Basisklasse werden ja überschrieben und Elementvariablen gibt es keine. Ausserdem ist es verboten, Instanzen dieser Klasse zu erzeugen. Warum also überhaupt diese Klasse erzeugen?

Also, erstens muss eine Klasse nicht nur aus abstrakten Methoden bestehen. Es reicht, wenn nur eine einzige Methode abstrakt ist.

Zweitens kann man auf die Weise Verwandtschaftsverhältnisse festlegen. Nur weil die eine Klasse eine "get" Methode hat, und die andere eine "get" Methode hat, kann man nicht automatisch davon ausgehen dass beide "get" zu einem ähnlichen Zweck da sind. Sobald beide von der selben abstrakten Klasse erben, ist das aber eindeutig. Und dann kann man sie auch gleichberechtigt behandeln.

Gast
2006-04-25, 16:10:39
Geh ich richtig in der Annahme, dass das ein Code ist, der unter anderem Datenkapselung und Polymorphie vereinigt:

#include <iostream>
using namespace std;

class A {
private:
A*pNext;
static A *pFirst;
protected:
int nr;
public:
A(int n) {
nr=n;
pNext = pFirst;
pFirst =this;
}
virtual void f() {
cout << nr << " ";
}static void plst();
};

A *A::pFirst =NULL;

void A::plst() {
for(A *p=pFirst; p; p=p->pNext)
p->f();
cout << endl;
}

class B : public A {
private:
char *name;
public:
B(int n, char *str): A(n), name(str) {}
virtual void f() {
cout << name << " " << nr << " ";
}
};

int main() {
char warte;

A a(9), b(6);
B d(0, "5"), e(2, "4");
A c(7);

A::plst();

cin >> warte;

return 0;
}

Leider ist mir nicht so ganz klar, warum bei den Objekten "d" und "e", welche ja zur Klasse B gehören, die Funktion f() von der Klasse A überschrieben wird, wenn ich die statische Funktion plst von A aufrufe. Dachte f() wird nur überschrieben, wenn ich B::plst() schreibe ?

Aber das macht ja keinen Unterschied, ob ich jetz A::plst() oder B::plst schreibe

Gast
2006-04-25, 16:39:57
Polymorphie bedeutet in erster Linie, dass eine Klasse eine Methode einer geerbten Klasse überschreiben kann. Der Clou an der ganze Sache ist jetzt der, dass die vererbte Klasse, also die Basisklasse, nun intern mit unterschiedlicher Funktionalität/Werten arbeiten kann, die der Konsument, also die erbende Klasse, implementiert.
Polymorphie bietet sich also vor allem für ein Framework an. Wo man es oft exzessiv erlebt, ist z.B. beim Rendern der UI.

HellHorse
2006-04-25, 19:49:13
Polymorphie bedeutet in erster Linie, dass eine Klasse eine Methode einer geerbten Klasse überschreiben kann.
OMG NEIN!!!!!111111 Das ist late-binding.
Polymorphie beizeichnet die Fähigkeit einer Variablen Werte unterschiedlicher Typen zu enthalten. Das heisst, dass eine Varible vom statischen Typ T nicht nur Instanzen vom Typ T, sondern auch Instanzen von einem Subtyp S von T enthalten kann. Das hat _nichts_ mit dem Methodlookup zu tun.

Gast
2006-04-25, 19:54:26
Könnte vielleicht irgend jemand nen Beispielcode posten? Glaub das wär das einfachste um es zu kapieren :)

Monger
2006-04-25, 20:07:08
Könnte vielleicht irgend jemand nen Beispielcode posten? Glaub das wär das einfachste um es zu kapieren :)


Okay...
Verzeih mir bitte die Java Syntax.



Tier tier1 = new Tier(); // tier1 ist vom Typ Tier
Hund hund1 = new Hund(); // hund1 ist vom Typ Hund

tier1 = hund1; // ist jetzt tier1 ein Hund oder ein Tier?


Du hast tier1 als Tier deklariert, aber trotzdem kann tier1 auch ein Hund sein.

Gast
2006-04-25, 22:27:38
OMG NEIN!!!!!111111 Das ist late-binding.


Das _ist_ Polymorphie, und zwar Laufzeit-Polymorphie.

Xmas
2006-04-26, 01:18:49
Okay...
Verzeih mir bitte die Java Syntax.



Tier tier1 = new Tier(); // tier1 ist vom Typ Tier
Hund hund1 = new Hund(); // hund1 ist vom Typ Hund

tier1 = hund1; // ist jetzt tier1 ein Hund oder ein Tier?


Du hast tier1 als Tier deklariert, aber trotzdem kann tier1 auch ein Hund sein.
Und um das ganze nun fortzusetzen:
tier1.gibLaut();
...und der Hund wird bellen.