В чем разница между абстрактной функцией и виртуальной функцией? - PullRequest
1470 голосов
/ 24 декабря 2008

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

Ответы [ 26 ]

1 голос
/ 01 марта 2017

Из общего объектно-ориентированного вида:

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

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

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

1 голос
/ 07 июня 2016

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

Для функций

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

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

0 голосов
/ 02 марта 2019

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

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

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

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

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

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

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

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

0 голосов
/ 27 октября 2018

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

0 голосов
/ 27 июня 2011

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

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

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

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

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

...