2009-07-17 7 views
3

Dies ist eine der langweiligen akademischen OOP Fragen, aber es ist keine Hausaufgabe. Ich habe die Frage von einem Anfänger Programmierer über eines dieser dummen Lehrbücher Beispiele über OOP.Welche sollte welche erben?

Stellen Sie sich vor, dass Sie eine Square-Klasse und eine Cube-Klasse entwerfen, welche welche erben sollen?

Ich sehe eine Beziehung, aber was es ist, kann ich nicht wirklich sehen!

Könnten Sie mir ein logisches Argument für OOP geben?

+1

Square erbt Polygon, und Cube erbt Movie. – aehiilrs

+0

lol, gut eins: D – AraK

Antwort

22

Weder! Da ein Quadrat kein Würfel ist und ein Würfel kein Quadrat, sollten beide nicht von dem anderen erben. Square kann von Polygon erben und Cube kann von Polyeder erben, aber die beiden schließen sich gegenseitig aus.

+5

+1 für bessere Vererbung Modell – RedFilter

+1

Ich stimme zu: weder. Ich konnte jedoch eine Has-A-Beziehung sehen: Ein Cube hat eine Sammlung von 6 Quadraten. – Nelson

+0

Es macht Sinn für mich :) Danke. – AraK

14

Es gibt keine Vererbung. Vererbung ist eine "ist-a" -Beziehung (Nun, manchmal nicht einmal eine "ist-a" -Beziehung, wie im folgenden Link erwähnt). Ein Würfel ist kein Quadrat, und ein Quadrat ist kein Würfel.

Wie würden Sie konstruieren, hängt davon ab, wie Sie modellieren. Du könntest mit etwas wie einem Würfel gehen, der 6 Quadrate hat (ein Würfel ist nicht, er hat 6 Quadrate; eine Zusammensetzung), oder ein Würfel hat eine Seitengröße, genau wie ein Quadrat. Aber sobald es kein "ist-a" gibt, wäre eine Vererbung eine gefährliche Zone ...

Außerdem muss in einer Vererbung alles, was für die Basisklasse gültig ist, für die Abgeleitete gelten. Es ist das Square extends Rectangle Problem. Zum Beispiel:

Angenommen Würfel erbt Square: Wenn Ihr Square eine Methode changeArea (double area) und getSide() hat, sollte das gleiche für den Cube möglich sein. Aber es ist nicht, da die Fläche eines Würfels 6 mal die Fläche eines Quadrats ist (es hat 6 Quadrate).

Platz Nimmt man erbt Cube: Wenn Ihr Cube ein setVolume (doppeltes Volumen) Methode hat, wird Ihr Platz gebrochen werden, wenn es kein Volumen

Schließlich hat, wenn Sie Vererbung verwenden möchten, können Sie erstellen Ein GeometryObjectWithEqualSides Objekt, dann könnten beide davon erben. :)

+1

Ein Würfel IS Ein Quadrat, aber mit einer dritten Dimension (Tiefe) – TheTXI

+0

+1 für die Bereitstellung einer klaren Faustregel – RedFilter

+0

Aber in diesem Fall würde ich Ihnen zustimmen ... es gibt nicht viel, was Sie von einem Quadrat erben würde, würde nicht 't musste überladen werden – TheTXI

0

Weder sollte das andere erben. Der eine ist eine 2-dimensionale Form, der andere ist ein 3-dimensionales Objekt. Es gibt wirklich nicht genug Ähnlichkeit zwischen den beiden, um die Vererbung zu rechtfertigen.

Nun könnte man möglicherweise einen Würfel macht zusammengesetzt von Quadraten, wenn Sie ein separates Objekt für jede Seite benötigen;)

1

erben beide von hypercube

+1

Nein. Ein Quadrat ist kein Würfel, ein Würfel ist kein Hyperwürfel, Ein Quadrat ist kein Hypercube. – Svante

+2

Eigentlich sind sie. Ein Hyper-Cube ist ein anderer Name für einen so genannten N-Cube. ein Quadrat ist ein 2-Würfel, ein Würfel ist ein 3-Würfel usw. –

1
struct Square // Rectangle actually 
{ 
    Square(int dx, int dy) : dx(dx), dy(dy) {}; 

    int dx; 
    int dy; 

    int floor_area() { return dx*dy; }; 
}; 

struct Cube : Square // Cuboid actually 
{ 
    Cube(int dx, int dy, int dz) : Square(dx, dy), dz(dz) {}; 

    int dz; 

    int cube_area() { return floor_area()*2+dx*dz*2+dy*dz*2; }; 
}; 

scheint zu sein, dass Liskov substitution principle hier nicht verletzt wird.

+0

Hmmm ...! Obwohl ich der Logik Ihrer Antwort nicht zustimme, unterstützt jedes Beispiel, das Ihnen in den Sinn kommt, Ihre Antwort. Grrr! –

+0

Das ist falsch. Was ist die Implementierung der Methode area()? Wäre es das Gebiet von allen Seiten oder das der Basis? Ich habe ein Zimmer, das ich unterbringen möchte. Ich gehe zum Laden und frage nach Quadraten, die ich benutzen kann (verschiedene Materialien), aber das Tender gibt mir Betonwürfel ... –

+0

Je näher an Code, hat Cube ein Quadrat (die Basis) und eine Höhe, aber es ist kein Platz. Sie können Würfel nicht dort verwenden, wo Quadrate benötigt werden (wenn eine Pyramide eine quadratische Basis hat, können Sie dort keinen Würfel verwenden). –

0

Die meisten Kommentare hier sagen richtig, dass keiner von ihnen von einem anderen erben sollte. Dies gilt in den meisten Fällen.Aber ich denke, es gibt eine allgemeinere Antwort: Es hängt von Ihren Erwartungen an sie ab. Sie erwarten Square was zu tun? Macht es Cube auch? Kann der andere Weg sein - können Sie Square verwenden, wenn Sie Cube verwenden? Ich denke, beide Aussagen "Würfel tut alles, was Quadrat tut" und "Quadrat tut alles, was Würfel tut" sind nach dem gesunden Menschenverstand falsch, also sollte keiner von ihnen von einem anderen erben. Es liegt jedoch an Ihnen, über deren Struktur und Verhalten zu entscheiden, denn Sie definieren, was Ihr Programm macht und woraus es besteht.

Höchstwahrscheinlich "Cube enthält 6 Quadrate" ist die Beziehung, die Sie gesehen haben.

1

Man könnte argumentieren, dass das Quadrat und der Würfel zwei Instanzen derselben Klasse "Hypercube" sind, die auch den Punkt (0 Dimensionen), das Liniensegment (1 Dimension) und andere darüber hinaus umfassen würde. Die Anzahl der Dimensionen und die Länge einer Seite reichen aus, um eine bestimmte Instanz von Hypercube zu definieren (Sie könnten natürlich einen n-dimensionalen Ursprungspunkt und eine Orientierung hinzufügen).

Der Hyperkubus könnte Funktionen/Methoden bereitstellen, die Werte für die Anzahl der Scheitelpunkte, Kanten, Flächen usw. für diese bestimmte Instanz zurückgeben.

Siehe Hypercube auf Wikipedia für weitere Informationen.