我经常读到抽象类只是用来扩展它们。我有一个项目,我直接使用抽象类。 例如,负责从网络摄像头流中捕获图片的类:
import org.opencv.core.Mat;
import org.opencv.highgui.VideoCapture;
public abstract class Photographer {
//create camera object
static VideoCapture camera;
static Mat image;
public Photographer(){
camera = new VideoCapture();
image = new Mat();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//capture image
public final static Mat capture() {
camera.open(1);
camera.read(image);
camera.release();
return image;
}
}
我的想法是,因为这个类只有一个函数而且不需要任何参数,所以我可以将它定义为抽象的,所以我不必创建它的实例,只是为了获得一个图片。
这是抽象使用的错误想法吗?我怎么能以正确的方式认识到它?
感谢您的帮助。
的Derb
答案 0 :(得分:3)
抽象类的想法是表示一些具有更详细“版本”的抽象。例如,“汽车”,“车辆”,“机制”可以成为大众高尔夫的抽象。
我的想法是,因为这个类只有一个函数而且不需要任何参数,所以我可以将它定义为抽象
我认为这不是抽象类的正确用法,因为我上面写的原因 - 该类不代表任何东西的抽象而不是用于扩展。
答案 1 :(得分:2)
如果这些陈述中的任何一个适用于您的情况,请考虑使用抽象类:
You want to share code among several closely related classes.
You expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private).
You want to declare non-static or non-final fields. This enables you to define methods that can access and modify the state of the object to which they belong.
有关相同的详细信息,您可以查看link
答案 2 :(得分:2)
您正在以静态方式使用capture()方法。静态和抽象是完全不相关的概念。
如果你真的想在这种情况下处理抽象,我会在抽象类中有这样的东西。
public Mat capture() {
camera.open(1);
camera.read(image);
camera.release();
implemenntCapature();
return image;
}
public abstract implemenntCapture();
如果你有WeddingPhotographer或WarPhotographer,那么他们可以将自己的行为添加到他们的implementCapture()。
例如:
public void implementCapture() {
addSoftfocus();
}
public void implementCapture() {
duckBullets();
}