Как и когда использовать абстрактный класс
Это моя тестовая программа на Java. Я хочу знать, насколько абстрактный класс важнее здесь и почему мы используем абстрактный класс для этого.
Это обязательный или лучший метод; если так как?
class Shape1 {
int i = 1;
void draw() {
System.out.println("this is shape:" + i);
}
}
class Shape2 {
int i = 4;
void draw() {
System.out.println("this is shape2:" + i);
}
}
class Shape {
public static void main(String args[]) {
Shape1 s1 = new Shape1();
s1.draw();
Shape2 s2 = new Shape2();
s2.draw();
}
}
Ответы
Ответ 1
Абстрактные классы - это классы, содержащие один или несколько абстрактных методов. Абстрактный метод - это метод, объявленный, но не содержащий реализации. Абстрактные классы не могут быть созданы и требуют подклассов для реализации реализаций абстрактных методов. Рассмотрим пример абстрактного класса и абстрактный метод.
Предположим, что мы моделировали поведение животных, создавая иерархию классов, начатую с базового класса под названием Animal. Животные способны делать разные вещи, такие как полет, рытье и ходьба, но есть некоторые общие операции, а также еда и сон. Некоторые общие операции выполняются всеми животными, но и по-другому. Когда операция выполняется по-другому, это хороший кандидат для абстрактного метода (принуждение подклассов к созданию пользовательской реализации). Давайте посмотрим на очень примитивный базовый класс животных, который определяет абстрактный метод для создания звука (например, лай собак, коровье мошенничество или свинцовое окование).
public abstract Animal
{
public void eat(Food food)
{
// do something with food....
}
public void sleep(int hours)
{
try
{
// 1000 milliseconds * 60 seconds * 60 minutes * hours
Thread.sleep ( 1000 * 60 * 60 * hours);
}
catch (InterruptedException ie) { /* ignore */ }
}
public abstract void makeNoise();
}
Обратите внимание, что ключевое слово abstract используется для обозначения как абстрактного метода, так и абстрактного класса. Теперь любое животное, которое хочет быть инстанцированным (например, собака или корова), должно реализовать метод makeNoise - иначе невозможно создать экземпляр этого класса. Давайте посмотрим на подкласс Dog and Cow, который расширяет класс Animal.
public Dog extends Animal
{
public void makeNoise() { System.out.println ("Bark! Bark!"); }
}
public Cow extends Animal
{
public void makeNoise() { System.out.println ("Moo! Moo!"); }
}
Теперь вам может быть интересно, почему бы не объявить абстрактный класс как интерфейс, а Собака и Корова реализуют интерфейс. Конечно, вы могли бы - но вам также нужно было бы реализовать методы приема пищи и сна. Используя абстрактные классы, вы можете наследовать реализацию других (не абстрактных) методов. Вы не можете сделать это с помощью интерфейсов - интерфейс не может обеспечить реализацию каких-либо методов.
Ответ 2
Здесь вы должны использовать абстрактный класс или интерфейс, чтобы создать общий базовый класс/интерфейс, который предоставляет метод void draw()
, например.
abstract class Shape() {
void draw();
}
class Circle extends Shape {
void draw() { ... }
}
...
Shape s = new Circle();
s.draw();
Я бы использовал интерфейс. Однако вы можете использовать абстрактный класс, если:
- Вам нужно/нужно предоставить общие функции или члены класса (например, член
int i
в вашем случае).
- В ваших абстрактных методах есть что-то иное, кроме общедоступного доступа (который является единственным типом доступа, разрешенным для интерфейсов), например. в моем примере
void draw()
будет иметь видимость пакета.
Ответ 3
Абстрактный класс имеет отношение типа "is-a" к вашим подклассам. Так, например, у вас может быть абстрактный класс Shape
, который имеет материал любой формы (например, функцию рисования), а затем класс SquareShape
. Каждая квадратная форма представляет собой форму, но не все формы являются квадратными формами.
В вашем примере у вас есть 2 типа формы и класс, в котором есть 2 экземпляра. Это не отношения, которые вы должны определить с помощью abstract
Я думаю.
Возможно, вы захотите что-то сделать с вашими именами, потому что это довольно маленький пример, трудно увидеть реальные последствия файлов и как они должны работать.
Ответ 4
Пример примера для использования абстрактного класса в java.
package use_of_abstract;
abstract class Shapes
{
int i=1;
abstract void draw();
abstract void color(String mycolor);
//not an abstract method
void fill()
{
System.out.println("Non-Abstract Method -> Fill");
}
//not an abstract method
String anotherMethod(String input)
{
return input + " additional text";
}
}
package use_of_abstract;
public class Shape_One extends Shapes
{
int i=1;
@Override
void draw()
{
System.out.println("This is Shape One:"+i);
}
@Override
void color(String mycolor)
{
System.out.println("This is Shape One:"+mycolor);
}
@Override
String anotherMethod(String anotherMethod)
{
System.out.println("This is Shape One:"+anotherMethod);
return anotherMethod;
}
}
package use_of_abstract;
public class Shape_Two extends Shapes
{
int i=2;
@Override
void draw()
{
System.out.println("This is Shape Two :"+i);
}
@Override
void color(String mycolor)
{
System.out.println("This is Shape Two Color:"+mycolor);
}
@Override
String anotherMethod(String anotherMethod)
{
System.out.println("This is Shape Two:"+anotherMethod);
return anotherMethod;
}
}
package use_of_abstract;
import java.awt.Color;
public class Shape_Main
{
public static void main(String args[])
{
Shape_One s1;
Shape_Two s2;
s1=new Shape_One();
s2= new Shape_Two();
s1.draw();
s2.draw();
s1.fill();
s2.fill();
s1.color("Blue");
s2.color("Green");
s1.anotherMethod("HELLO..............Its Another Method 1");
s2.anotherMethod("HELLO..............Its Another Method 2");
}
}
Ответ 5
Абстрактный класс - это класс, который имеет хотя бы один метод, не реализованный, или абстрактное ключевое слово. Например, абстрактный метод может выглядеть так:
public abstract String myMethod(String input);
(обратите внимание, что метод заканчивается точкой с запятой).
И класс может выглядеть следующим образом:
public abstract class MyClass {
public abstract String myMethod(String input);
public String anotherMethod(String input) {
return intput + " additional text";
}
}
Абстрактный класс не может быть создан. Абстрактные классы требуют подкласса для реализации отсутствующего поведения, чтобы его можно было создать.
Основная цель абстрактного класса - предоставить совместное воплощение общего поведения - содействие повторному использованию кода.
В Java такой же эффект может быть достигнут путем использования состава классов вместо наследования из широко определенных абстрактных классов. Это позволяет использовать более модульные, функциональные классы, способствующие повторному использованию кода, что, в свою очередь, повышает ремонтопригодность.
Мой совет будет заключаться в том, чтобы использовать абстрактный класс только в случае крайней необходимости и, в частности, избегать использования его как сумку с трюком, полную всех видов функциональности.
В Scala можно использовать черты, которые являются изящным способом решения этой проблемы. Тем не менее, для этого требуется много внимания.
Ответ 6
Обычные вещи + необычные вещи = абстрактный класс
Когда использовать?
Абстрактный класс лучше всего подходит для сценариев, в которых есть многократно используемый код, который вы не хотите писать снова и снова + Есть несколько вещей, специфичных для каждого класса.
Пример?
Церемония:
Общие вещи: Гимн Петь, Флаг Подъема и т.д.
Конкретные вещи: индийский флаг, гимн Индии (для Индии), флаг Китая, гимн Китая (для Китая) и т.д.
![enter image description here]()
Как это использовать?
1) Создать абстрактный класс
2) Поместите все в публичные методы, которые являются общими
3) Поместите все в абстрактные методы, специфичные для дочерних классов.
Где образец кода?
Базовый класс:
public abstract class BaseCeremony{
Flag natonalFlag;
Anthem anthem;
//**** Common Task ******//
public void startCeremony(){
configure();
hoistFlag();
singAnthem();
}
public void hoistFlag(){
natonalFlag.hoist();
}
public void singAnthem(){
anthem.anthem();
}
private void configure(){
natonalFlag = provideFlag();
anthem = provideAnthem();
}
//**** Differs in all part ******//
public abstract Flag provideFlag();
public abstract Anthem provideAnthem();
}
В дочернем классе вам просто нужно обеспечить реализацию необычной части.
ChildClass
public class IndianCeremony extends BaseCeremony{
public Flag provideFlag(){
return new IndianFlag();
}
public Anthem provideAnthem(){
return new IndianAnthem();
}
}
бонус
- Абстрактный класс - это неполный класс, поэтому вы не можете создавать его объекты.
- Абстрактный класс должен иметь хотя бы один абстрактный метод, чтобы квалифицироваться как абстрактный класс
- Пример реализации абстрактного класса в Android
Ответ 7
Абстрактный класс, как следует из его названия, является абстрактным.
Абстрактный класс не говорит о части реализации. На самом деле мы расширяем абстрактный класс, чтобы обеспечить реализацию его абстрактных методов. Он также может иметь не абстрактные методы.
Отметьте здесь: Использование абстрактного класса в Java
EDIT:
Пример кода:
abstract class Shapes {
int i=1;
abstract void draw();
// Remember : Non-abstract methods are also allowed
void fill() {
System.out.println("Non abstract method - fill");
}
}
class Shape1 extends Shapes {
int i=1;
void draw(){
System.out.println("This is Shape 1:"+i);
}
}
class Shape2 extends Shapes {
int i=2;
void draw() {
System.out.println("This is Shape 2:"+i);
}
}
class Shape {
public static void main(String args[])
{
Shape1 s1 = new Shape1();
s1.draw(); // Prints This is Shape 1:1
Shape2 s2 = new Shape2();
s2.draw(); // Prints This is Shape 2:2
}
}