Использование абстрактного класса напрямую. Это чтобы избежать?

1

Я часто читал, что абстрактные классы предназначены только для их расширения. У меня есть проект, в котором я использую абстрактные классы напрямую. Например, класс, который отвечает за захват изображения из потока веб-камеры:

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
    Я не вижу, где вы создаете экземпляр Photographer , поэтому вы не «используете» этот абстрактный класс. Действительно, неправильное использование вами статических переменных и функций указывает на то, что вы (еще) не поняли концепцию Javas OO.
  • 0
    Если создание экземпляра класса не имеет смысла и имеет common functionality которые могут наследовать другие, тогда это должно быть abstract . Например, если у вас есть абстрактный класс Person и два других класса Man и Woman наследуются от него, то не будет смысла разрешать создание экземпляров Person . Таким образом, в этом случае лучше использовать Person как абстрактный класс. Таким образом, в вашем случае вам все равно нужно разрешить другому классу наследовать от Photographer потому что вы не сможете создать его экземпляр, но с какой целью это в любом случае поможет вам в этом?
Теги:
abstract-class

3 ответа

2
Лучший ответ

вы используете свой метод 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();
}
3

Идея абстрактного класса состоит в том, чтобы представить некоторую абстракцию с более подробными "версиями". Например, "Автомобиль", "Транспортное средство", "Механизм" могут быть абстракциями для Volkswagen Golf.

Я думал, что этот класс имеет только одну функцию и не нуждается в каких-либо параметрах, я мог бы определить ее как абстрактный

Я думаю, что это неправильное использование абстрактных классов из-за причин, которые я написал выше, - класс не представляет абстракции ни для чего и не предназначен для расширения.

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.

Для получения более подробной информации вы можете проверить эту ссылку

  • 0
    Спасибо за ссылку. Внизу есть этот абзац: Члены класса Абстрактный класс может иметь статические поля и статические методы. Вы можете использовать эти статические члены со ссылкой на класс (например, AbstractClass.staticMethod ()) так же, как и с любым другим классом. Из этого я понимаю, что мне разрешено использовать мой опубликованный класс, как я делаю сейчас. Это правильно?
  • 0
    @HerrDerb О, да, вам разрешено это делать, за исключением того, что ваш код будет выдавать исключение NullPointerException при вызове, потому что camera пуста, потому что вы не инициализируете ее перед использованием ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню