[oop] 추상 함수와 가상 함수의 차이점은 무엇입니까?

추상 함수와 가상 함수의 차이점은 무엇입니까? 어떤 경우에 가상 또는 추상을 사용하는 것이 좋습니다? 가장 좋은 방법은 무엇입니까?



답변

추상 함수는 기능을 가질 수 없습니다. 기본적으로 모든 하위 클래스는이 메소드의 자체 버전을 제공해야하지만 상위 클래스에서 구현하려고 시도하는 것은 너무 일반적입니다.

가상 함수 는 기본적으로 외모를 말하고 있습니다. 자식에 충분하거나 충분하지 않을 수있는 기능이 있습니다. 충분하다면이 방법을 사용하고 그렇지 않은 경우 나를 무시하고 고유 한 기능을 제공하십시오.


답변

추상 함수에는 구현이 없으며 추상 클래스에서만 선언 할 수 있습니다. 이렇게하면 파생 클래스가 구현을 제공하게됩니다.

가상 함수는 기본 구현을 제공하며 추상 클래스 또는 비추 상 클래스에 존재할 수 있습니다.

예를 들어 :

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();
}


답변

  1. abstract수업 만 가능abstract 회원 .
  2. abstract클래스한다는로부터 상속 abstract클래스 해야 overrideabstract 구성원.
  3. abstract멤버는 암시 적이다virtual .
  4. abstract멤버는 구현 (제공 할 수 없다 abstract라고 pure virtual일부 언어에서).

답변

항상 추상 함수를 재정의해야합니다.

그러므로:

  • 추상 함수상속자가 자체 구현을 제공해야하는 경우
  • 가상상속자가 결정해야 할 때

답변

추상 기능 :

  1. 추상 클래스 내에서만 선언 할 수 있습니다.
  2. 추상 클래스의 구현이 아닌 메소드 선언 만 포함합니다.
  3. 파생 클래스에서 재정의해야합니다.

가상 기능 :

  1. 비 추상 클래스뿐만 아니라 추상 내부에도 선언 할 수 있습니다.
  2. 메소드 구현을 포함합니다.
  3. 재정의 될 수 있습니다.

답변

추상 메서드 : 클래스에 추상 메서드가 포함 된 경우 해당 클래스는 추상으로 선언해야합니다. 추상 메소드에는 구현이 없으므로 해당 추상 클래스에서 파생 된 클래스는이 추상 메소드에 대한 구현을 제공해야합니다.

가상 메소드 : 클래스는 가상 메소드를 가질 수 있습니다. 가상 메소드에는 구현이 있습니다. 가상 메서드가있는 클래스에서 상속하면 가상 메서드 재정의하고 추가 논리를 제공하거나 논리를 자신의 구현으로 바꿀 수 있습니다.

사용시기 : 경우에 따라 특정 유형에 특정 방법이 있어야한다는 것을 알고 있지만이 방법에 어떤 구현이 필요한지 알 수 없습니다.
이러한 경우이 서명이있는 메소드가 포함 된 인터페이스를 작성할 수 있습니다. 그러나 그러한 경우가 있지만 해당 인터페이스의 구현 자에게 또 다른 일반적인 메소드 (이미 구현을 제공 할 수있는)가 있음을 알고 있으면 추상 클래스를 작성할 수 있습니다. 그런 다음이 추상 클래스에는 추상 메소드 (오버라이드해야 함)와 ‘공통’논리를 포함하는 다른 메소드가 포함됩니다.

직접 사용할 수는 있지만 상속자가 특정 동작을 변경할 수 있기를 원하지만 필수는 아니지만 가상 메서드를 사용해야합니다.


답변

설명 : 유추로. 잘하면 그것은 당신을 도울 것입니다.

문맥

나는 건물의 21 층에서 일합니다. 그리고 나는 불에 대한 편집증입니다. 세상 어딘가에서 불이 하늘 긁는 도구를 태우고 있습니다. 그러나 운 좋게도 화재시해야 할 일에 대한 지침서가 여기 있습니다.

비상 계단()

  1. 소지품을 수집하지 마십시오
  2. 화재 탈출을 걸어
  3. 건물 밖으로 걸어

기본적으로 FireEscape () 라는 가상 메소드입니다.

가상 방법

이 계획은 상황의 99 %에 매우 적합합니다. 작동하는 기본 계획입니다. 그러나 화재 탈출구가 막히거나 손상 될 가능성이 1 %입니다.이 경우 완전히 조여져 과감한 조치를 취하지 않으면 축배가됩니다. 가상 메소드를 사용하면 다음과 같이 할 수 있습니다. 기본 버전의 FireEscape () 계획을 자체 버전의 계획으로 재정의 할 수 있습니다.

  1. 창으로 실행
  2. 창문 밖으로 뛰어
  3. 바닥에 안전하게 낙하산

즉, 가상 메소드는 기본 계획을 제공하며, 필요한 경우 대체 할 수 있습니다 . 프로그래머가 적절하다고 생각하면 서브 클래스는 부모 클래스의 가상 메소드를 대체 할 수 있습니다.

추상 방법

모든 조직이 잘 훈련 된 것은 아닙니다. 일부 조직은 소방 훈련을하지 않습니다. 그들은 전반적인 탈출 정책이 없습니다. 모든 사람은 자신을위한 것입니다. 경영진은 기존 정책에만 관심이 있습니다.

즉, 각 사람은 자신의 FireEscape () 메소드를 개발 해야 합니다. 한 사람이 화재 탈출구를 걸어 나갑니다. 다른 사람은 낙하산을 씁니다. 다른 사람은 로켓 추진 기술을 사용하여 건물에서 날아갑니다. 다른 사람이 밖으로 나옵니다. 기본 FireEscape () 계획이있는 한 경영진은 어떻게 탈출 해야하는지 신경 쓰지 않습니다. 그렇지 않은 경우 OHS가 벽돌처럼 조직에 쓰러 질 것입니다. 이것이 추상적 방법입니다.

이 둘의 차이점은 무엇입니까?

추상 메소드 : 하위 클래스는 자체 FireEscape 메소드를 구현 해야 합니다. 가상 메소드를 사용하면 기본 계획이 기다리고 있지만 충분하지 않은 경우 직접 구현 하도록 선택할 수 있습니다 .

이제 그렇게 힘들지 않습니까?