250 likes | 350 Views
CIS3023: Programming Fundamentals for CIS Majors II Summer 2010. Abstract Classes. “None of the abstract concepts comes closer to fulfilled utopia than that of eternal peace.” --Theodor W. Adorno. Course Lecture Slides 7 June 2010. Ganesh Viswanathan. Example.
E N D
CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Abstract Classes “None of the abstract concepts comes closer to fulfilled utopia than that of eternal peace.” --Theodor W. Adorno Course Lecture Slides7 June 2010 GaneshViswanathan
Example • Drawing Application • Create different shapes: circle, rectangle, …
So now we can instantiate a GeometricObject as follows: GeometricObject g = new GeometricObject(); • But does it make sense ?
Solution – Abstract Classes! • Do not allow instantiation of GeometricObject class • How? • Declare it as abstract as follows: public abstract class GeometricObject { … }
Abstract Class Want to add methods to compute area and perimeter of any GeometricObject
Abstract Class Added methods to compute area and perimeter for any GeometricObject!
public abstract class GeometricObject{ private String color = "white"; private boolean filled; protected GeometricObject() { filled = false; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public booleanisFilled() { return filled; } public void setFilled(boolean filled) { this.filled = filled; } public String toString() { return "color: " + color + " and filled: " + filled; } }
public class Circle extends GeometricObject { private double radius; public Circle() { radius = 1.0; } public Circle(double radius) { this.radius = radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public double getArea() { return radius * radius * Math.PI; } public double getPerimeter() { return 2 * radius * Math.PI; } }
public class Rectangle extends GeometricObject{ private double width; private double height; public Rectangle() { width = 1.0; height = 1.0; } public Rectangle(double width, double height) { this.width = width; this.height = height; } public double getWidth() { return width; } public void setWidth(double w){ width = w; } public double getHeight() { return height; } public void setHeight(double h) { height = h; } public double getArea() { return width * height; } public double getPerimeter() { return 2 * (width + height); } }
public class Main { public static void main(String[] args) { GeometricObject[] objects = new GeometricObject[5]; objects[0] = new Circle(5); objects[1] = new Rectangle(5, 3); for(inti = 0; i < objects.length; i++){ if(objects[i] != null) System.out.println("Area: " + objects[i].getArea() + "Perimeter: " + objects[i].getPerimeter()); } } } Will give error!! cannot find symbol: getArea( ) and getPerimeter( )
public abstract class GeometricObject { private String color = "white"; private boolean filled; protected GeometricObject() { filled = false; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public booleanisFilled() { return filled; } public void setFilled(boolean filled) { this.filled = filled; } public String toString() { return "color: " + color + " and filled: " + filled; } public abstract double getArea(); public abstract double getPerimeter(); } Solution
public class Main { • public static void main(String[] args) { • GeometricObject[] objects = new GeometricObject[5]; • objects[0] = new Circle(5); • objects[1] = new Rectangle(5, 3); • for(inti = 0; i < objects.length; i++){ • if(objects[i] != null) • System.out.println("Area: " + • objects[i].getArea() • + "Perimeter: " + • objects[i].getPerimeter()); • } • } • } Will compile successfully now!
public abstract class GeometricObject { private String color = "white"; private boolean filled; protected GeometricObject() { filled = false; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public booleanisFilled() { return filled; } public void setFilled(boolean filled) { this.filled = filled; } public String toString() { return "color: " + color + " and filled: " + filled; } public double getArea() { return 0; } public double getPerimeter { return 0; } } Why not create concrete getArea( ) and getPerimeter( )methods with no bodies??
Abstract Class Characteristics • A class that contains abstract methods must be abstract. • However, it is possible to declare an abstract class that contains no abstract methods. • A subclass can be abstract even if its superclass is concrete.
Abstract Class, contd. • All derived classes of an abstract class will have to implement its abstract method(s), or they too will be abstract • An abstract class cannot be instantiated • An abstract class can be used as a data type though. GeometricObjectg; GeometricObject[] geo = new GeometricObject[10];
Why is the following allowed? • Why allow abstract classes to be used as data types if they can not be instantiated? GeometricObject[] geo = new GeometricObject[10];
public class Main { public static void main(String[] args) { GeometricObject[] objects = new GeometricObject[5]; objects[0] = new Circle(5); objects[1] = new Rectangle(5, 3); for(inti = 0; i < objects.length; i++){ if(objects[i] != null) System.out.println("Area: " + objects[i].getArea() + "Perimeter: " + objects[i].getPerimeter()); } } } Allows you to take advantage of polymorphism!
public class TestGeometricObject { public static void main(String[] args) { Circle c = new Circle(5); Rectangle r1 = new Rectangle(5, 3); Rectangle r2 = new Rectangle(3, 3); System.out.println(“c and r1 have equal area: " + equalArea(c, r1)); System.out.println(“r1 and r2 have equal area: " + equalArea(r1, r2)); } // what should the definition of equalArea() look like? public static booleanequalArea( ? obj1, ? obj2) { return obj1.getArea() == obj2.getArea(); } }
public class TestGeometricObject { public static void main(String[] args) { Circle c = new Circle(5); Rectangle r1 = new Rectangle(5, 3); Rectangle r2 = new Rectangle(3, 3); System.out.println(“c and r1 have equal area: " + equalArea(c, r1)); System.out.println(“r1 and r2 have equal area: " + equalArea(r1, r2)); } // what should the definition of equalArea() look like? public static booleanequalArea( Circle o1, Rectangle o2){ return o1.getArea() == o2.getArea(); } public static booleanequalArea( Rectangle o1, Rectangle o2){ return o1.getArea() == o2.getArea(); } } Option 1
public class TestGeometricObject { public static void main(String[] args) { Circle c = new Circle(5); Rectangle r1 = new Rectangle(5, 3); Rectangle r2 = new Rectangle(3, 3); System.out.println(“c and r1 have equal area: " + equalArea(c, r1)); System.out.println(“r1 and r2 have equal area: " + equalArea(r1, r2)); } public static booleanequalArea(GeometricObject obj1, GeometricObject obj2) { return obj1.getArea() == obj2.getArea(); } }
public class TestGeometricObject { public static void main(String[] args) { GeometricObject geoObject1 = new Circle(5); GeometricObject geoObject2 = new Rectangle(5, 3); System.out.println(“geoObject1 and geoObject2 have area: " + equalArea(geoObject1, geoObject2)); System.out.println(“geoObject2 and geoObject3 have area: " + equalArea(geoObject2, geoObject3)); } public static booleanequalArea(Object obj1, Object obj2) {// why not declare the parameters as Object type? return obj1.getArea() == obj2.getArea(); } } Will give an error as Object class has no getArea( ) method!
public class TestGeometricObject { public static void main(String[] args) { GeometricObject geoObject1 = new Circle(5); GeometricObject geoObject2 = new Rectangle(5, 3); System.out.println(“geoObject1 and geoObject2 have area: " + equalArea(geoObject1, geoObject2)); System.out.println(“geoObject2 and geoObject3 have area: " + equalArea(geoObject2, geoObject3)); } public static booleanequalArea(Object obj1, Object obj2) {// why not declare the parameters as Object type? GeometricObject g1 = (GeometricObject)obj1; GeometricObject g2 = (GeometricObject)obj2; return g1.getArea() == g2.getArea(); } }
Get more info! http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html http://mindprod.com/jgloss/interfacevsabstract.html