В чем разница между абстрактной функцией и виртуальной функцией?

В чем разница между абстрактной функцией и виртуальной функцией? В каких случаях рекомендуется использовать виртуальный или абстрактный? Какой из них лучший?

24.12.2008 14:11:43
Абстрактная функция должна быть переопределена, в то время как виртуальная функция может быть переопределена.
Jordan Parmer 24.12.2008 14:14:18
Виртуальные функции могут иметь стандартную / стандартную реализацию в базовом классе.
Martin 5.12.2012 04:50:03
Ключевое слово здесь абстрактно ; Они не существуют и представляют собой лишь смутное представление о функции (сигнатура метода)
Cole Johnson 28.05.2017 18:09:43
27 ОТВЕТОВ
РЕШЕНИЕ

Абстрактная функция не может иметь функциональности. Вы в основном говорите, что любой дочерний класс ДОЛЖЕН предоставить собственную версию этого метода, однако он слишком общий, чтобы даже пытаться реализовать его в родительском классе.

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

2718
15.03.2016 15:47:03
И, конечно, если вы переопределяете виртуальный метод, вы всегда можете обратиться к родительскому методу, вызвав base.Foo (...)
Brann 5.07.2011 00:45:51
Спасибо. Это намного лучшее и более простое объяснение, чем что-либо в документации MSDN. (У меня была головная боль после пяти минут чтения этого: msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx )
Jake 1.11.2011 15:49:27
Исходя из Java, я был немного озадачен, почему нам вообще нужно сделать его виртуальным, пока я не прочитал это: stackoverflow.com/a/1062126/193634
Rosdi Kasim 17.04.2013 07:18:30
@MeqDotNet Это означает, что если вам нравится моя реализация, используйте меня, если НЕ напишите свой собственный лучше меня :)
Usman Younas 6.11.2013 18:54:15
Это должно быть в справочной библиотеке Microsoft, которую я потратил 10 минут на чтение и до сих пор путаюсь.
SamChen 27.05.2014 22:21:37

Вы должны всегда переопределять абстрактную функцию.

Таким образом:

  • Абстрактные функции - когда наследник должен предоставить собственную реализацию
  • Виртуальный - когда дело за наследником
61
10.06.2012 16:37:41

Абстрактная функция не имеет реализации и может быть объявлена ​​только в абстрактном классе. Это заставляет производный класс предоставлять реализацию.

Виртуальная функция обеспечивает реализацию по умолчанию и может существовать в абстрактном или неабстрактном классе.

Так, например:

public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}
299
8.06.2019 21:08:12
Очень полезно видеть пример кода - помогает сделать более понятными различные объяснения в ответах.
Simon Tewsi 22.01.2013 21:39:50
Я откатил ответ до предыдущей версии: два класса - просто примеры, первый класс скомпилируется, поскольку он помечен как абстрактный, второй - нет. Независимо от того, наследует ли MyBase какой-то другой класс или нет, не имеет значения.
Dirk 12.06.2014 08:16:41
Разве ваш MyBaseкласс не должен каким-то образом реализовывать абстрактный класс? Я делаю это не часто, поэтому могу ошибаться. Я не вижу этого в вашем примере.
jp2code 27.06.2014 14:30:33
В приведенном выше примере MyBase показывает, что вы не можете сделать. То есть вы не можете иметь абстрактный метод в неабстрактном классе
JoshBerke 28.06.2014 15:27:11

Абстрактные методы всегда виртуальны. У них не может быть реализации.

Это главное отличие.

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

С помощью абстрактного метода вы заставляете потомков предоставлять реализацию.

10
10.06.2012 16:39:38

В основном вы используете виртуальный метод, когда хотите, чтобы наследники расширяли функциональность, ЕСЛИ они хотят.

Вы используете абстрактные методы, когда хотите, чтобы наследники реализовали функциональность (и в этом случае у них нет выбора)

3
16.04.2009 09:02:26

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

Виртуальный метод: класс может иметь виртуальный метод. Виртуальный метод имеет реализацию. Когда вы наследуете от класса, который имеет виртуальный метод, вы можете переопределить виртуальный метод и предоставить дополнительную логику или заменить логику своей собственной реализацией.

Когда использовать что: В некоторых случаях вы знаете, что определенные типы должны иметь определенный метод, но вы не знаете, какую реализацию должен иметь этот метод.
В таких случаях вы можете создать интерфейс, который содержит метод с этой подписью. Однако, если у вас есть такой случай, но вы знаете, что у разработчиков этого интерфейса также будет другой общий метод (для которого вы уже можете предоставить реализацию), вы можете создать абстрактный класс. Этот абстрактный класс затем содержит абстрактный метод (который должен быть переопределен) и другой метод, который содержит «общую» логику.

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

29
16.04.2009 09:03:07
  1. Только abstractклассы могут иметь abstractчленов.
  2. Не- abstractкласс, который наследует от abstractкласса, должен иметь override своих abstractчленов.
  3. abstractЧлен неявно virtual.
  4. abstractЧлен не может обеспечить любую реализацию ( abstractназывается pure virtualв некоторых языках).
80
16.04.2009 09:03:40
Номер 3 не имеет смысла для меня. Я думаю, что вы хотели сказать «член абстрактного класса неявно виртуален» (т. Е. Вы можете предоставить ему функциональность, не указывая, что он виртуальный).
Hobo Spider 14.01.2014 18:39:24
Нет, я имел в виду именно то, что написал. Член абстрактного класса может быть virtualили нет virtual. Элемент abstract(то есть абстрактное свойство, абстрактный метод) похож на виртуальный метод, то есть вы можете переопределить его, за исключением того, что он не несет с собой реализацию по умолчанию.
Mehrdad Afshari 15.01.2014 07:03:30
Цитируется «Абстрактный член» неявно «виртуальный». Но я где-то видел, что кто-то создал абстрактных членов, явно добавив «виртуальное» ключевое слово. Что не является необходимым и на самом деле это дало мне сомнение, пока я не прочитал ваш ответ.
bonCodigo 20.05.2014 12:31:56
Пожалуйста, включите вспомогательные ссылки для пункта 4. И ваш пост не принес ничего другого, чего не было в предыдущих.
Rafael 27.11.2017 13:19:49
Это просто набор утверждений без объяснений.
Reverse Engineered 19.02.2020 14:03:06

Абстрактный метод - это метод, который должен быть реализован для создания конкретного класса. Объявление находится в абстрактном классе (и любой класс с абстрактным методом должен быть абстрактным классом), и оно должно быть реализовано в конкретном классе.

Виртуальный метод - это метод, который можно переопределить в производном классе с помощью переопределения, заменив поведение в суперклассе. Если вы не переопределите, вы получите оригинальное поведение. Если вы делаете, вы всегда получаете новое поведение. Это противоположно не виртуальным методам, которые не могут быть переопределены, но могут скрыть оригинальный метод. Это делается с помощью newмодификатора.

Смотрите следующий пример:

public class BaseClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }


    public virtual void SayGoodbye()
    {
        Console.WriteLine("Goodbye");
    }

    public void HelloGoodbye()
    {
        this.SayHello();
        this.SayGoodbye();
    }
}


public class DerivedClass : BaseClass
{
    public new void SayHello()
    {
        Console.WriteLine("Hi There");
    }


    public override void SayGoodbye()
    {
        Console.WriteLine("See you later");
    }
}

Когда я создаю экземпляр DerivedClassи звоню SayHello, или SayGoodbyeя получаю «Привет!» И «Увидимся позже». Если я звоню HelloGoodbye, я получаю «Привет» и «Увидимся позже». Это потому, что SayGoodbyeявляется виртуальным и может быть заменено производными классами. SayHelloскрыт, поэтому, когда я вызываю это из своего базового класса, я получаю свой оригинальный метод.

Абстрактные методы неявно виртуальны. Они определяют поведение, которое должно присутствовать, больше как интерфейс.

22
16.11.2011 03:01:06

Насколько я понимаю:

Абстрактные методы:

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

Виртуальные методы:

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

-4
27.06.2011 16:59:14

Я сделал это проще, внеся некоторые улучшения в следующие классы (из других ответов):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestOO
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass _base = new BaseClass();
            Console.WriteLine("Calling virtual method directly");
            _base.SayHello();
            Console.WriteLine("Calling single method directly");
            _base.SayGoodbye();

            DerivedClass _derived = new DerivedClass();
            Console.WriteLine("Calling new method from derived class");
            _derived.SayHello();
            Console.WriteLine("Calling overrided method from derived class");
            _derived.SayGoodbye();

            DerivedClass2 _derived2 = new DerivedClass2();
            Console.WriteLine("Calling new method from derived2 class");
            _derived2.SayHello();
            Console.WriteLine("Calling overrided method from derived2 class");
            _derived2.SayGoodbye();
            Console.ReadLine();
        }
    }


    public class BaseClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }
        public virtual void SayGoodbye()
        {
            Console.WriteLine("Goodbye\n");
        }

        public void HelloGoodbye()
        {
            this.SayHello();
            this.SayGoodbye();
        }
    }


    public abstract class AbstractClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }


        //public virtual void SayGoodbye()
        //{
        //    Console.WriteLine("Goodbye\n");
        //}
        public abstract void SayGoodbye();
    }


    public class DerivedClass : BaseClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }

        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }

    public class DerivedClass2 : AbstractClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }
        // We should use the override keyword with abstract types
        //public new void SayGoodbye()
        //{
        //    Console.WriteLine("See you later2");
        //}
        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }
}
10
10.06.2012 16:46:59

Ответ был предоставлен несколько раз, но вопрос о том, когда использовать каждый из них, является решением времени разработки. Я считаю хорошей практикой пытаться объединять определения общих методов в отдельные интерфейсы и выводить их в классы на соответствующих уровнях абстракции. Выгрузка общего набора абстрактных и виртуальных определений методов в класс делает класс невозможным, когда лучше всего определить неабстрактный класс, который реализует набор кратких интерфейсов. Как всегда, это зависит от того, что лучше всего соответствует вашим конкретным потребностям.

1
19.08.2013 10:28:31

Абстрактная функция:

  1. Он может быть объявлен только внутри абстрактного класса.
  2. Он содержит только объявление метода, а не реализацию в абстрактном классе.
  3. Он должен быть переопределен в производном классе.

Виртуальная функция:

  1. Он может быть объявлен как в абстрактном, так и в не абстрактном классе.
  2. Содержит реализацию метода.
  3. Это может быть отменено.
36
13.07.2017 08:58:54

Я видел в некоторых местах абстрактный метод, определенный ниже. **

«Абстрактный метод должен быть реализован в дочернем классе»

** Я чувствовал, что это похоже.

Нет необходимости, чтобы абстрактный метод был реализован в дочернем классе, если дочерний класс также является абстрактным .

1) Абстрактный метод не может быть частным методом. 2) Абстрактный метод не может быть реализован в одном абстрактном классе.

Я бы сказал .. если мы реализуем абстрактный класс, вы должны переопределить абстрактные методы из базового абстрактного класса. Потому что ... Реализация абстрактного метода осуществляется с помощью ключевого слова переопределения. Аналогично виртуальному методу.

Нет необходимости для реализации виртуального метода в унаследованном классе.

                                 ----------CODE--------------

public abstract class BaseClass
{
    public int MyProperty { get; set; }
    protected abstract void MyAbstractMethod();

    public virtual void MyVirtualMethod()
    {
        var x = 3 + 4;
    }

}
public abstract class myClassA : BaseClass
{
    public int MyProperty { get; set; }
    //not necessary to implement an abstract method if the child class is also abstract.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
public class myClassB : BaseClass
{
    public int MyProperty { get; set; }
    //You must have to implement the abstract method since this class is not an abstract class.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
2
23.03.2016 22:18:56

Абстрактная функция не может иметь тело и ДОЛЖНА быть переопределена дочерними классами

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

2
12.01.2016 17:17:10

Большинство приведенных выше примеров используют код - и они очень, очень хороши. Мне не нужно добавлять к тому, что они говорят, но следующее простое объяснение, которое использует аналогии, а не код / ​​технические термины.

Простое объяснение - объяснение с использованием аналогий

Абстрактный метод

Вспомни Джорджа Буша. Он говорит своим солдатам: «Идите воевать в Ирак». И это все. Все, что он указал, - то, что борьба должна быть сделана. Он не уточняет, как именно это произойдет. Но я имею в виду, вы не можете просто выйти и «бороться»: что это значит точно? я бьюсь с B-52 или моим деррингером? Эти конкретные детали оставлены кому-то еще. Это абстрактный метод.

Виртуальный метод

Дэвид Петреус высоко в армии. Он определил, что означает бой:

  1. Найти врага
  2. Нейтрализовать его.
  3. Выпить пива потом

Проблема в том, что это очень общий метод. Это хороший метод, который работает, но иногда он недостаточно конкретен. Хорошая вещь для Петреуса в том, что его приказы имеют свободу действий и масштаб - он позволил другим изменить свое определение «бой», в соответствии с их конкретными требованиями.

Частные вакансии Блоггс читает приказ Петреуса и получает разрешение на реализацию своей собственной версии боя, в соответствии с его конкретными требованиями:

  1. Найди врага.
  2. Стреляй ему в голову.
  3. Идти домой
  4. Есть пиво.

Нури аль Малики также получает такие же приказы от Петреуса. Он также должен сражаться. Но он политик, а не человек пехоты. Очевидно, он не может стрелять в своих политических врагов в голову. Поскольку Петреус предоставил ему виртуальный метод, Малики может реализовать свою собственную версию метода боя в соответствии с его конкретными обстоятельствами:

  1. Найди врага.
  2. Его арестовали с некоторыми обвинениями в сфабрикованном обвинении.
  3. Идти домой
  4. Есть пиво.

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

Разница между двумя

  • Джордж Буш не доказывает никаких деталей реализации. Это должно быть предоставлено кем-то другим. Это абстрактный метод.

  • Петреус, с другой стороны, действительно предоставляет подробности реализации, но он дал разрешение своим подчиненным переопределить его приказы своей собственной версией, если они могут придумать что-то лучшее.

надеюсь, это поможет.

2
6.05.2016 00:55:57

Абстрактная функция (метод):

● Абстрактный метод - это метод, который объявлен с ключевым словом abstract.

● У него нет тела.

● Это должно быть реализовано производным классом.

● Если метод является абстрактным, тогда класс должен быть абстрактным.

виртуальная функция (метод):

● Виртуальный метод - это метод, который объявлен с ключевым словом virtual, и его можно переопределить методом производного класса с помощью ключевого слова override.

● Производному классу решать переопределять его или нет.

2
26.01.2018 08:11:03

В C # нет ничего, что называется виртуальным классом.

Для функций

  1. Абстрактная функция имеет только сигнатуру, класс накопителя должен переопределяться функциональностью.
  2. Виртуальная функция будет содержать часть функциональности, которую класс привода может переопределить или не переопределить в соответствии с требованием

Вы можете решить с вашим требованием.

1
28.04.2018 14:29:30

объяснение: с аналогиями. надеюсь, это поможет вам.

контекст

Я работаю на 21 этаже здания. И я параноик по поводу огня. Время от времени, где-то в мире, огонь сжигает небоскреб. Но, к счастью, у нас где-то есть инструкция о том, что делать в случае пожара:

Пожарный выход()

  1. Не собирай вещи
  2. Прогулка к пожарной лестнице
  3. Выйти из здания

Это в основном виртуальный метод, называемый FireEscape ()

Виртуальный метод

Этот план довольно хорош для 99% обстоятельств. Это основной план, который работает. Но есть 1% -ная вероятность того, что пожарный выход заблокирован или поврежден, и в этом случае вы полностью облажаетесь, и вы станете тостом, если не предпримете решительных действий. С виртуальными методами вы можете сделать это просто: вы можете переопределить базовый план FireEscape () своей собственной версией плана:

  1. Беги к окну
  2. Выпрыгнуть в окно
  3. Парашют безопасно на дно

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

Абстрактные методы

Не все организации хорошо подготовлены. Некоторые организации не проводят пожарные учения. У них нет общей политики побега. Каждый мужчина для себя. Руководство интересует только такая политика, существующая.

Другими словами, каждый человек вынужден разрабатывать свой собственный метод FireEscape (). Один парень выйдет из пожарной лестницы. Другой парень будет прыгать с парашютом. Другой парень будет использовать технологию ракетного двигателя, чтобы улететь от здания. Другой парень спустится. Руководству все равно, как вы сбежите, если у вас есть базовый план FireEscape () - если вы этого не сделаете, вы можете быть уверены, что OHS обрушится на организацию, как тонна кирпичей. Это то, что подразумевается под абстрактным методом.

В чем разница между двумя снова?

Абстрактный метод: подклассы вынуждены реализовывать свой собственный метод FireEscape. При использовании виртуального метода вас ждет базовый план, но вы можете реализовать свой собственный, если он недостаточно хорош.

Теперь это было не так сложно, не так ли?

29
2.05.2017 07:53:07

С общей объектно-ориентированной точки зрения:

Относительно абстрактного метода : Когда вы помещаете абстрактный метод в родительский класс, фактически вы говорите дочерним классам: Обратите внимание, что у вас есть подпись метода, подобная этой. И если вы хотите использовать его, вы должны реализовать свой собственный!

Что касается виртуальной функции : Когда вы помещаете виртуальный метод в родительский класс, вы говорите производным классам: эй, здесь есть функциональность, которая что-то делает для вас. Если это полезно для вас, просто используйте его. Если нет, переопределите это и реализуйте свой код, даже вы можете использовать мою реализацию в своем коде!

это некоторая философия о различии между этими двумя понятиями в общем ОО

1
1.03.2017 10:35:20

Привязка - это процесс отображения имени на единицу кода.

Позднее связывание означает, что мы используем имя, но откладываем отображение. Другими словами, мы сначала создаем / упоминаем имя и позволяем некоторому последующему процессу обрабатывать сопоставление кода с этим именем.

Теперь рассмотрим:

  • По сравнению с людьми машины действительно хороши в поиске и сортировке
  • По сравнению с машинами люди действительно хороши в изобретательстве и инновациях

Итак, краткий ответ: virtualинструкция позднего связывания для машины (время выполнения), а abstractинструкция позднего связывания для человека (программиста)

Другими словами, virtualозначает:

«Дорогая среда выполнения , свяжите соответствующий код с этим именем, выполняя то, что вы делаете лучше всего: поиск »

Принимая во внимание, что abstractозначает:

«Уважаемый программист , пожалуйста, свяжите соответствующий код с этим именем, выполняя то, что вы делаете лучше всего: изобретая »

Для полноты, перегрузка означает:

«Уважаемый компилятор , свяжите соответствующий код с этим именем, выполняя то, что вы делаете лучше всего: сортировку ».

6
1.02.2018 19:29:34

Виртуальный метод :

  • Виртуальный означает, что мы можем переопределить его.

  • Виртуальная функция имеет реализацию. Когда мы наследуем класс, мы можем переопределить виртуальную функцию и предоставить нашу собственную логику.

  • Мы можем изменить тип возвращаемого значения Виртуальной функции при реализации
    функции в дочернем классе (что можно сказать как концепция
    Shadowing).

Абстрактный метод

  • Абстрактное означает, что мы ДОЛЖНЫ переопределить его.

  • Абстрактная функция не имеет реализации и должна находиться в абстрактном классе.

  • Это можно только объявить. Это заставляет производный класс обеспечить его реализацию.

  • Абстрактный член неявно виртуален. Аннотация может называться чисто виртуальной в некоторых языках.

    public abstract class BaseClass
    { 
        protected abstract void xAbstractMethod();
    
        public virtual void xVirtualMethod()
        {
            var x = 3 + 4;
        }
    } 
    
3
28.03.2018 20:31:09

Абстрактный метод не имеет реализации. Он объявлен в родительском классе. Дочерний класс ответственен за реализацию этого метода.

Виртуальный метод должен иметь реализацию в родительском классе, и это облегчает дочернему классу делать выбор, использовать ли эту реализацию родительского класса или иметь новую реализацию для этого метода в дочернем классе.

1
5.06.2018 12:38:45

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

Виртуальная функция (фактически метод) - это также функция, которую вы объявляете, и она должна быть реализована в одном из классов иерархии наследования.

Унаследованные экземпляры такого класса также наследуют реализацию, если вы ее не реализуете, в классе более низкой иерархии.

1
27.07.2018 11:07:41

Исходя из фона C ++, C # virtual соответствует C ++ virtual, в то время как C # абстрактные методы соответствуют C ++ чистой виртуальной функции.

0
27.10.2018 06:55:35

Абстрактная функция или метод - это общедоступное «имя операции», предоставляемое классом, и его цель, наряду с абстрактными классами, в первую очередь заключается в предоставлении формы ограничения в проектировании объектов по отношению к структуре, которую должен реализовать объект.

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

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

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

Они оба представляют собой форму полиморфизма в парадигме ориентации объекта.

Мы можем использовать абстрактные методы и виртуальные функции вместе для поддержки хорошей модели наследования.

Мы проектируем хорошую абстрактную структуру основных объектов нашего решения, затем создаем базовые реализации, находя их более склонными к дальнейшей специализации, и делаем их виртуальными, наконец, мы специализируем наши базовые реализации, в конечном итоге «переопределяя» унаследованные виртуальные.

0
24.02.2019 00:43:51

Здесь я пишу некоторый пример кода, надеясь, что это может быть довольно осязаемым примером, чтобы увидеть поведение интерфейсов, абстрактных классов и обычных классов на самом базовом уровне. Вы также можете найти этот код в github в качестве проекта, если вы хотите использовать его в качестве демонстрационной версии: https://github.com/usavas/JavaAbstractAndInterfaceDemo

public interface ExampleInterface {

//    public void MethodBodyInInterfaceNotPossible(){
//    }
    void MethodInInterface();

}

public abstract class AbstractClass {
    public abstract void AbstractMethod();

    //    public abstract void AbstractMethodWithBodyNotPossible(){
    //
    //    };

    //Standard Method CAN be declared in AbstractClass
    public void StandardMethod(){
        System.out.println("Standard Method in AbstractClass (super) runs");
    }
}

public class ConcreteClass
    extends AbstractClass
    implements ExampleInterface{

    //Abstract Method HAS TO be IMPLEMENTED in child class. Implemented by ConcreteClass
    @Override
    public void AbstractMethod() {
        System.out.println("AbstractMethod overridden runs");
    }

    //Standard Method CAN be OVERRIDDEN.
    @Override
    public void StandardMethod() {
        super.StandardMethod();
        System.out.println("StandardMethod overridden in ConcreteClass runs");
    }

    public void ConcreteMethod(){
        System.out.println("Concrete method runs");
    }

    //A method in interface HAS TO be IMPLEMENTED in implementer class.
    @Override
    public void MethodInInterface() {
        System.out.println("MethodInInterface Implemented by ConcreteClass runs");

    //    Cannot declare abstract method in a concrete class
    //    public abstract void AbstractMethodDeclarationInConcreteClassNotPossible(){
    //
    //    }
    }
}
0
2.03.2019 12:50:32

Если класс является производным от этого абстрактного класса, он вынужден переопределять абстрактный член. Это отличается от виртуального модификатора, который указывает, что элемент может быть переопределен.

0
10.09.2019 19:10:13