Download 03_More_OOP_and_slick2d

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
3. JAVA INHERITANCE
…AND SLICK2D INTRO
INHERITANCE
• Main idea:
• Create a new class (Child) from an existing
one (Parent)
• Add new methods to the Child class
[optional]
• Re-implement methods from the Parent
class [optional]
• Advantages:
• Don't have to re-type old code
• And changes to Parent automatically
propogate
• Natural type-description
• If "Apple" is a type of "Fruit", use inheritance.
• Polymorphism
• Used extensively in Java
BASIC EXAMPLE
public class Shape
{
protected Color mColor;
public Shape(Color c) { mColor = c; }
public Color getColor () {return mColor; }
}
public class Circle extends Shape
{
protected float mRad;
public Circle(Color c, floar r) { super(c); mRad = r; }
public float getRadius() { return mRad; }
}
public class Box extends Shape
{
protected float mWidth, mHeight;
public Box(Color c, floar w, float h) { super(c);
mWidth = w; mHeight = h; }
public float getWidth() { return mWidth; }
}
BASIC EXAMPLE, CONT.
public static void main(String[] args)
{
Shape s = new Shape(Color.RED);
Circle c = new Circle(new Color(255,255,0), 5.0f);
Box b = new Box(Color.BLUE, 20.0f, 13.0f);
System.out.println(s.getColor()); // Java AWT Color(r=255,g=0,b=0)
System.out.println(c.getColor()); // Java AWT Color(r=255,g=255,b=0)
System.out.println(c.getRadius()); // 5.0
//System.out.println(b.getRadius());
// ERROR!
//System.out.println(s.getRadius());
// ERROR!
System.out.println(b.getWidth()); // 20.0
}
POLYMORPHISM
• The ability to assign derived-class instances to baseclass variables.
public static void main(String[] args)
{
Shape s = new Circle(new Color(255,255,0), 5.0f);
Shape t = new Box(Color.BLUE, 20.0f, 13.0f);
System.out.println(s.getColor());
System.out.println(c.getColor());
//System.out.println(s.getRadius());
//System.out.println(t.getWidth());
// ERROR!
// ERROR!
• You can, however cast a reference
Circle c = (Circle)s;
System.out.println(c.getRadius());
// 5.0
• But be careful…
Circle d = (Circle)t;
System.out.println(d.getRadius());
// Compiles…but a run-time error
JAVA LIMITATIONS
• Can only extend from one base class.
• No multiple inheritance
• Arguments for this:
• Avoids the “deadly diamond” [explain]
• Each object should only be “made from” another object
• Arguments against this:
• Sometimes makes super-deep inheritance trees
• Locks you into a rigid inheritance structure
• e.g. you have a GroundBasedObject that is the parent of Vehicle
which is the parent of WheeledCar which is the parent of Tank
• You later change your mind that you want your Tank to be a
spaceship. You now have to modify every parent class in the chain
• Enter interfaces
MISC
• @Override
• Remember that?
• [Refresher and connection to extends]
• Object class
• Everything indirectly inherits from this (except primitives)
• Generics
• From lab2: public class Foo<E>
• E only supports those methods that in Object
• If you want to require only certain types of generics, use:
public class Foo<E extends MinBase>
IMPLEMENTS
• Java classes can implement any number of
interface classes.
• An interface class looks like this:
// No method bodies allowed AND no attributes.
public interface Talker
{
public void talk();
}
• If you choose to implement this you do:
public class Dog implements Talker
{
public void talk()
{
System.out.println("Woof!");
}
}
• An interface is a contract – the implementing class
must define all methods from the interface.
IMPLEMENTS, CONT.
• The polymorphism rules still apply.
• If you choose to implement multiple interfaces, use:
MyClass implements ifaceA, ifaceB, ifaceC
{
}
ANOTHER ALTERNATIVE
• Inheritance is an “is-a” relationship
• Another option: “has-a”
• You create an instance of another class
• And call methods of that internal instance.
• Important Side-discussion: Stacks and Queues
ACCESS MODIFIER EXAMPLE AGAIN
// TheClass.java
package accessexample;
// OtherClass.java
package accessexample;
public class TheClass
{
public class OtherClass
{
In-class
Inpackage
}
import accessexample.*;
public class TestApp
{
public static void main(String[] args)
{
World
}
}
}
// OtherClass.java
import accessexample.TheClass;
public class OtherClass extends TheClass
{
In-subclass
}
This is the class of interest
ACCESS RULES
Can access?
Modifier
In-class
In-package
In-Subclass
World
public
Y
Y
Y
Y
protected
Y
Y
Y
N
no modifier (packageprivate)
Y
Y
N
N
private
Y
N
N
N
INTRO TO SLICK2D
• What is it?
• Cross-platform (Linux, OSX, Win)
• An example of an external dependency
• Also uses native libraries (written in C most likely)
• Windows = .dll
•
•
•
•
OSX = .dylib
Linux = .so
Graphics, Animation, Input
We'll use it for simple visualizations
Good example of inheritance
Has a few (mostly-easy) setup steps that are IDE / platform
specific
INHERITANCE IN SLICK2D
• Main class overview
• You Create a class (Foo) that extends BasicGame
(org.newdawn.slick.BasicGame)
• Override 3 main methods: init, update, and render
• Create (in main) an AppGameContainer (Bob) and a Foo inst
(Hat)
• Attach Hat to Bob (by passing it to Bob's constructor)
• Call Bob's start method – that will call the 3 methods of Hat at
appropriate times.
• Listener design pattern in Slick2D
• [On Board]
• make special note of the use of implements.