OOP : Trying to design a good class structure
<p>Follow up code snippet review question I posted: <a href="http://codereview.stackexchange.com/questions/143576/oop-designing-class-inheritances">http://codereview.stackexchange.com/questions/143576/oop-designing-class-inheritances</a></p>

<p>This is homework so off the bat I am not asking to do it for me but to clarify for me so that I understand.</p>

<p>Here is what the assignment said about the program I have to write:</p>

<p><strong>Required:</strong>
Write an OO Python Program showing how your sub-classes inherit from the super-class(es) You can have one class (preferred but not a must) or two or more super classes.</p>

<p>What I have to do is write a oo python program showing sub-classing inherited by a class or two or more superclasses. The program has to be about shapes. As an example of what I mean by that is:</p>

<p>Shape: Square</p>

<p>Attributes:</p>

<ul>
<li>length </li>
<li>width</li>
</ul>

<p>Methods:</p>

<ul>
<li>area</li>
<li>perimeter</li>
</ul>

<p>I have more shapes of course but from that I find the common attributes and methods from all the shapes and make superclasses and sup-classes.</p>

<p>My super classes are like: 2dShapes, circles and 3dShapes. My sub-classes are like length and width. My methods are area and perimeter. Note I am rambling at this point. The code snippet below does not show this instead I was thinking about making a superclass for attributes and methods and than sub-classes for the shapes? maybe?</p>

<p>Question: is this a good class structure? Is there a better way to structure the classes here? Here is an example of what I'm thinking about how to do this.</p>

<pre><code>class Shapes(attributes):
    def __init__(self):
        attributes.__init__(self)
        # not sure how to go on to make the attributes like height and length, radius ect. Maybe like this???
    def height(self):
        raise NotImplementedError # again this program is not supose to actually do anything. The program is just for us to understand inheritance with classes and super classes.

class 2dShapes(Shapes):
    class Square(self):
        def height(self):
            # ???
</code></pre>

<p>So at this point I am so confused about where to start. Also I am super new to python so be gentle to me  :p</p>

<p>I do not want to give answers that are too specific, because homework, but here is an example which I think might orient you in the right direction.</p>

<p>In Object Oriented Programming, there is the concept of polymorphism: when instances of many different subclasses are related by some common superclass. You often see it explained as "a B is an A", like in "a Pear is a Fruit", "a Cat is an Animal", "a Triangle is a Shape". Subclasses all share a common set of methods and members present in the superclass, but their implementation of these methods can vary.</p>

<p>Here is an example (sorry, C style, not a Python person) with animals. The method hearNoise() accepts an animal, but will also work correctly if a subtype is passed to it:</p>

<pre><code>abstract class Animal {
    abstract String makeNoise();
}

class Cat extends Animal {
    String makeNoise() {
        return "Meow!";
    }
}

class Dog extends Animal {
    String makeNoise() {
        return "Woof!";
    }
}

void hearNoise(Animal a) {
    println(a.makeNoise());
}

int main() {
    hearNoise(new Cat()); //returns "Meow!"
    hearNoise(new Dog()); //returns "Woof!"
}
</code></pre>

<p>The same principles can be applied to geometric shapes. They all have common methods and members : their perimeter, their area, their color, etc. When you have a shape, you can expect with 100% certitude you will be able to call a method to calculate a perimeter. However, the implementation, the way that specific shape subclass handles perimeter calculation, is what differs from shape to shape.</p>

python python-3.x oop inheritance