Как и когда использовать абстрактный класс - PullRequest
34 голосов
/ 15 мая 2011

Это моя тестовая программа на 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();
    }
}

Ответы [ 6 ]

20 голосов
/ 15 мая 2011

Вы бы использовали абстрактный класс или интерфейс здесь, чтобы создать общий базовый класс / интерфейс, который обеспечивает метод void draw(), например,

abstract class Shape() {
  void draw();
}

class Circle extends Shape {
   void draw() { ... }
}

...

Shape s = new Circle();
s.draw();

Я бы обычно использовал интерфейс.Однако вы можете использовать абстрактный класс, если:

  1. Вам необходимо / вы хотите предоставить общие функции или члены класса (например, член int i в вашем случае).
  2. Ваши абстрактные методыиметь что-либо, кроме открытого доступа (который является единственным типом доступа, разрешенным для интерфейсов), например, в моем примере void draw() будет иметь видимость пакета.
5 голосов
/ 15 мая 2011

Абстрактный класс имеет отношение типа "is-a" с вашими подклассами.Так, например, у вас может быть абстрактный класс Shape, в котором есть материал любой формы (например, функция рисования), а затем класс SquareShape.Каждая квадратная форма является формой, но не все формы являются квадратными.

В вашем примере у вас есть 2 типа фигур, и у класса есть 2 экземпляра.Это не та связь, которую вы должны определить с помощью abstract Я думаю.

Возможно, вы захотите что-то сделать с вашими именами, потому что это довольно небольшой пример, трудно понять реальное значение файлови как они должны работать.

3 голосов
/ 20 сентября 2013

пример использования абстрактного класса в 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");


    }   
}
2 голосов
/ 15 мая 2011

Абстрактный класс - это класс, в котором есть хотя бы один не реализованный метод или ключевое слово abstract.Например, абстрактный метод может выглядеть следующим образом:

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 можно использовать черты, которые являются элегантным способом решения этой проблемы.Тем не менее, это требует большого внимания, чтобы сделать это правильно.

1 голос
/ 16 апреля 2019

Обычные вещи + Необычные вещи = Абстрактный класс

Когда использовать?

Абстрактный класс лучше всего подходит для сценариев, в которых есть многократно используемый код, который вы не хотите писать снова и снова + Есть несколько вещей, специфичных для каждого класса.

Пример

церемония:

Обычные вещи: Петь гимн, флаг подъема и т. Д.
Особые вещи: Индийский флаг, гимн Индии (для Индии), флаг Китая, гимн Китая (для Китая) и т. Д.

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
1 голос
/ 15 мая 2011

Абстрактный класс, как и предполагает его название, является абстрактным.

Абстрактный класс не говорит о части реализации.Фактически, мы расширяем абстрактный класс, чтобы обеспечить реализацию его абстрактных методов.Он также может иметь неабстрактные методы.

Проверьте здесь: Использование абстрактного класса в Java

РЕДАКТИРОВАТЬ:

Пример кода:

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
       }
  }
...