Я часто читал, что абстрактные классы предназначены только для их расширения. У меня есть проект, в котором я использую абстрактные классы напрямую. Например, класс, который отвечает за захват изображения из потока веб-камеры:
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
вы используете свой метод capture() статическим способом. статические и абстрактные - совершенно не связанные понятия.
Если вы действительно хотели иметь дело с абстракцией в этом случае, у меня было бы что-то подобное в абстрактном классе.
public Mat capture() {
camera.open(1);
camera.read(image);
camera.release();
implemenntCapature();
return image;
}
public abstract implemenntCapture();
Если у вас есть WeddingPhotographer или WarPhotographer, то они могут добавить свое собственное поведение в свой файл implementationCapture().
например:
public void implementCapture() {
addSoftfocus();
}
public void implementCapture() {
duckBullets();
}
Идея абстрактного класса состоит в том, чтобы представить некоторую абстракцию с более подробными "версиями". Например, "Автомобиль", "Транспортное средство", "Механизм" могут быть абстракциями для Volkswagen Golf.
Я думал, что этот класс имеет только одну функцию и не нуждается в каких-либо параметрах, я мог бы определить ее как абстрактный
Я думаю, что это неправильное использование абстрактных классов из-за причин, которые я написал выше, - класс не представляет абстракции ни для чего и не предназначен для расширения.
Рассмотрите возможность использования абстрактных классов, если какое-либо из этих утверждений относится к вашей ситуации:
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.
Для получения более подробной информации вы можете проверить эту ссылку
camera
пуста, потому что вы не инициализируете ее перед использованием ...
Photographer
, поэтому вы не «используете» этот абстрактный класс. Действительно, неправильное использование вами статических переменных и функций указывает на то, что вы (еще) не поняли концепцию Javas OO.common functionality
которые могут наследовать другие, тогда это должно бытьabstract
. Например, если у вас есть абстрактный классPerson
и два других классаMan
иWoman
наследуются от него, то не будет смысла разрешать создание экземпляровPerson
. Таким образом, в этом случае лучше использоватьPerson
как абстрактный класс. Таким образом, в вашем случае вам все равно нужно разрешить другому классу наследовать отPhotographer
потому что вы не сможете создать его экземпляр, но с какой целью это в любом случае поможет вам в этом?