Визначення абстрактного класу без будь-яких абстрактних методів


114

Чи можна визначити абстрактний клас без додавання абстрактного методу?


1
Хороший приклад можна знайти у малюнку декораторів, дивіться тут . Обидва WindowDecoratorі CoffeeDecoratorє abstractкласами, але жоден abstractметод не включає .
MS Dousti

Відповіді:


168

Звичайно.

Оголошення реферату класу означає лише те, що ви не дозволяєте йому самостійно інстанціювати його.

Оголошення методу абстрактним означає, що підкласи повинні забезпечувати реалізацію цього методу.

Ці два є окремими поняттями, хоча очевидно, що ви не можете мати абстрактний метод у неабстрактному класі. Ви навіть можете мати абстрактні заняття finalметодами, але ніколи навпаки.


14

Так, ви можете це зробити. Чому ви просто не спробуйте це зробити?


6
І справа не тільки в ОП. Подивіться на всі результати, які постало питання!
Марк Ш

54
@ karim79 Немає потреби у високих конях і всьому, що поливає соусом. Спробуйте це не зовсім виявляє, чому це дозволено, але запитуючи це, можливо.
biziclop

7
@bizclop - Випробувати його для себе, можливо, поставило б більш продуктивне питання. Високих коней немає. Це досить просто. Його питання було "Чи можу я", а не "Чому це робить ...".
karim79

8
Якщо на питання можна відповісти простим "так" чи "ні", тоді запитуючий повинен розглянути питання про перефразовування, за допомогою Google або просто спробувати.
Лікування Тайлера

3
@ karim79 Так, питання можна було б краще сформулювати, але, мабуть, не потрібно так багато зусиль, щоб виглядати на крок вперед.
biziclop

8

Так, ти можеш. Абстрактний клас, який використовується в java, означає, що ви не можете створити об'єкт класу. І абстрактним методом підкласи повинні забезпечити реалізацію цього методу.

Таким чином, ви можете легко визначити абстрактний клас без будь-якого абстрактного методу.

Що стосується прикладу:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Це добре.


6

ТАК Ви можете створити абстрактний клас з будь-якого абстрактного методу. Найкращим прикладом абстрактного класу без абстрактного методу є HttpServlet
Абстрактний метод - метод, який не має тіла, Якщо ви оголосили хоча б один метод у класі, клас повинен бути оголошений як абстрагуйте його обов'язковим, але якщо ви оголосили абстрактний клас його не обов'язковим, щоб оголосити абстрактний метод всередині класу.

Ви не можете створити об'єкти абстрактного класу, а це означає, що його неможливо створити.


4

Так, ви можете оголосити клас, який ви не можете інстанціювати, лише методами, які вже мають реалізацію. Це було б корисно, якщо ви хочете додати абстрактні методи в майбутньому або якщо ви не хочете, щоб клас був безпосередньо інстанційним, навіть якщо він не має абстрактних властивостей.


Питання полягало не в порожніх абстрактних класах, а просто в абстрактних класах без абстрактних методів. Наскільки я можу бачити використання абсолютно порожнього абстрактного класу, немає поважних причин.
biziclop

1
Відповідь фіксована. Використання порожнього абстрактного класу може бути корисним, якщо у вас були вагомі підстави хотіти додати абстрактні методи пізніше і вам не доведеться мати справу з рефакторингом будь-яких інших батьківських класів.
Гордон Густафсон

1
У середині ієрархії абсолютно порожній (крім специфіки спадкування) абстрактний клас може мати сенс, якщо похідні цього класу матимуть різні договірні зобов’язання від інших похідних материнських структур.
supercat

3

так, ми можемо оголосити абстрактний клас без будь-якого абстрактного методу. мета оголошення класу абстрактним - не інстанціювати клас.

тож два випадки

1) абстрактний клас з абстрактними методами.

ці типи класів, ми повинні успадкувати клас від цього абстрактного класу і перекрити абстрактні методи в нашому класі, наприклад: GenricServlet class

2) абстрактний клас без абстрактних методів.

цього типу класів, ми повинні успадкувати клас від цього абстрактного класу, напр .: HttpServlet класу має на меті робити, хоча якщо ви не реалізуєте свою логіку в дочірньому класі, ви можете отримати батьківську логіку

перевірте вихідний код HttpServlet


2

Так, ми можемо мати абстрактний клас без абстрактних методів, оскільки обидва є незалежними поняттями. Оголошення реферату класу означає, що його неможливо встановити самостійно і його можна лише підкласифікувати. Оголошення абстрактного методу означає, що метод буде визначений у підкласі.


Чому я не повинен хотіти, щоб клас не міг бути примірником? Якась вагома причина, наприклад?
karlihnos

2

Так, ви можете визначити абстрактний клас без абстрактного методу. Однак якщо методу всередині немає, можливо, краще скористатися інтерфейсом


4
Хороша ідея для обмеження мінімальної кількості символів на 30.
Marc W

1
Якщо немає абстрактного методу, то як можна використовувати інтерфейс? Інтерфейс має всі методи абстрактні за замовчуванням.
Усман Рана

1

так, ти можеш це зробити.

оголосити клас абстрактним означає, що клас не буде інстанціювати жоден інший клас.

і повинен бути принаймні один абстрактний метод всередині цього і значення цього, ви можете оголосити абстрактний метод у цьому класі, якщо ви не декларуєте метод, ніж його добре.

приклад:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

це буде працювати точно.


1

Так, ти можеш. Іноді вам можуть задати це запитання, що це робить це? Відповідь: іноді нам доводиться обмежувати клас від інстанціювання самостійно. У такому випадку ми хочемо, щоб користувач розширив наш клас Анотація та інстанціював дочірній клас


1

Ви можете, питання, на мій погляд, більше вам. Від самого початку я скажу, що важкої та швидкої відповіді немає. Зробіть правильно для вашої поточної ситуації.

Для мене успадкування означає відносини «є-а». Уявіть клас собак, який можна поширити на більш спеціалізовані під види (Ельзас, Пудель тощо). У цьому випадку правильне робити собачий клас собаки, оскільки підтипи - це собаки. Тепер давайте уявимо, що собакам потрібний нашийник. У цьому випадку успадкування не має сенсу: нісенітниця мати "є-а" відносини між собаками та нашийниками. Це, безумовно, відносини "має", комір є об'єктом співпраці. Зробити нашийник абстрактним просто для того, щоб собаки мали його, не має сенсу.

Я часто виявляю, що абстрактні класи, які не мають абстрактних методів, насправді виражають відношення "має". У цих випадках я зазвичай вважаю, що код можна краще врахувати без використання успадкування. Я також вважаю, що абстрактні класи, які не мають абстрактних методів, часто мають запах коду і, принаймні, повинні призводити до питань, що виникають під час огляду коду.

Знову ж таки, це цілком суб’єктивно. Цілком можуть виникати ситуації, коли абстрактний клас без абстрактних методів має сенс, це повністю залежить від інтерпретації та обґрунтування. Прийміть найкраще рішення для того, над чим ви працюєте.


1

Насправді немає сенсу, якщо абстрактний клас не має будь-якого абстрактного методу. Абстрактний клас - це як батько. У цього батька є деякі властивості та поведінка, коли ти як дитина хочеш бути дитиною батька, батько каже дитині (ти), що це має бути таким чином, це наш МОТО, і якщо ти цього не хочеш робити, ти не моя дитина.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.