一个简单的面向对象的案例可以是一个图形库,其中有多种不同类型的形状(如圆形、矩形、三角形等)可以被绘制在屏幕上。我们可以用接口和抽象类来实现这个图形库。
首先,我们可以定义一个 Shape 接口来表示所有形状都应该具备的共同特征,如计算面积和绘制形状。具体的形状类都应该实现这个接口。
public interface Shape { double getArea(); void draw(); }
接下来,我们可以定义一个抽象类 AbstractShape 来实现 Shape 接口的方法中的一些公共部分,同时定义一些形状的基本属性,如位置、颜色等。这个抽象类也可以提供一些公共方法,如获取形状的位置和颜色等。
public abstract class AbstractShape implements Shape { protected int x; protected int y; protected Color color; public AbstractShape(int x, int y, Color color) { this.x = x; this.y = y; this.color = color; } public int getX() { return x; } public int getY() { return y; } public Color getColor() { return color; } @Override public void draw() { System.out.println("Drawing shape at (" + x + "," + y + ") with color " + color); } }
现在我们可以定义一些具体的形状类,如圆形、矩形和三角形,它们都继承自 AbstractShape 类并实现 Shape 接口。
public class Circle extends AbstractShape { private int radius; public Circle(int x, int y, Color color, int radius) { super(x, y, color); this.radius = radius; } @Override public double getArea() { return Math.PI * radius * radius; } } public class Rectangle extends AbstractShape { private int width; private int height; public Rectangle(int x, int y, Color color, int width, int height) { super(x, y, color); this.width = width; this.height = height; } @Override public double getArea() { return width * height; } } public class Triangle extends AbstractShape { private int base; private int height; public Triangle(int x, int y, Color color, int base, int height) { super(x, y, color); this.base = base; this.height = height; } @Override public double getArea() { return 0.5 * base * height; } }
现在我们可以创建一个测试类来测试这些形状类的功能。
public class ShapeTest { public static void main(String[] args) { Shape circle = new Circle(100, 100, Color.RED, 50); Shape rectangle = new Rectangle(200, 200, Color.BLUE, 100, 50); Shape triangle = new Triangle(300, 300, Color.GREEN, 50, 100); circle.draw(); System.out.println("Circle area: " + circle.getArea());
csharpCopy code rectangle.draw(); System.out.println("Rectangle area: " + rectangle.getArea()); triangle.draw(); System.out.println("Triangle area: " + triangle.getArea()); }}
输出结果应该是:
Drawing shape at (100,100) with color java.awt.Color[r=255,g=0,b=0] Circle area: 7853.981633974483 Drawing shape at (200,200) with color java.awt.Color[r=0,g=0,b=255] Rectangle area: 5000.0 Drawing shape at (300,300) with color java.awt.Color[r=0,g=255,b=0] Triangle area: 2500.0
通过这个案例,我们可以看到接口和抽象类的用法。通过定义 Shape 接口,我们可以让所有形状类都具备计算面积和绘制形状的功能。通过定义 AbstractShape 抽象类,我们可以将一些公共部分提取出来,避免了代码的重复。通过继承 AbstractShape 类并实现 Shape 接口,我们可以定义具体的形状类,并在测试类中调用它们的方法。这种方式使得代码更加清晰、简洁,也更易于维护。
此外,接口和抽象类还有以下几个不同之处:
在实际编程中,我们可以根据具体的需求来选择使用接口或抽象类。如果需要定义一组相互独立的行为,或者需要将不同的类归为一类,那么就应该使用接口。如果需要定义一个类的基本结构,并为它提供一些默认的实现,那么就应该使用抽象类。
原文链接:codingdict.net