1 / 25

CIS3023: Programming Fundamentals for CIS Majors II Summer 2010

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.

miach
Download Presentation

CIS3023: Programming Fundamentals for CIS Majors II Summer 2010

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Example • Drawing Application • Create different shapes: circle, rectangle, …

  3. So now we can instantiate a GeometricObject as follows: GeometricObject g = new GeometricObject(); • But does it make sense ?

  4. Solution – Abstract Classes! • Do not allow instantiation of GeometricObject class • How? • Declare it as abstract as follows: public abstract class GeometricObject { … }

  5. Abstract Class Want to add methods to compute area and perimeter of any GeometricObject

  6. Abstract Class Added methods to compute area and perimeter for any GeometricObject!

  7. 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; } }

  8. 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; } }

  9. 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); } }

  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()); } } } Will give error!! cannot find symbol: getArea( ) and getPerimeter( )

  11. 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

  12. 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!

  13. 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??

  14. 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.

  15. 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];

  16. 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];

  17. 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!

  18. 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(); } }

  19. 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

  20. 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(); } }

  21. 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!

  22. 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(); } }

  23. Get more info! http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html http://mindprod.com/jgloss/interfacevsabstract.html

More Related