Подтвердить что ты не робот

Как и когда использовать абстрактный класс

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

Ответ 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
       }
  }