추상 함수와 가상 함수의 차이점은 무엇입니까? 어떤 경우에 가상 또는 추상을 사용하는 것이 좋습니다? 가장 좋은 방법은 무엇입니까?
답변
추상 함수는 기능을 가질 수 없습니다. 기본적으로 모든 하위 클래스는이 메소드의 자체 버전을 제공해야하지만 상위 클래스에서 구현하려고 시도하는 것은 너무 일반적입니다.
가상 함수 는 기본적으로 외모를 말하고 있습니다. 자식에 충분하거나 충분하지 않을 수있는 기능이 있습니다. 충분하다면이 방법을 사용하고 그렇지 않은 경우 나를 무시하고 고유 한 기능을 제공하십시오.
답변
추상 함수에는 구현이 없으며 추상 클래스에서만 선언 할 수 있습니다. 이렇게하면 파생 클래스가 구현을 제공하게됩니다.
가상 함수는 기본 구현을 제공하며 추상 클래스 또는 비추 상 클래스에 존재할 수 있습니다.
예를 들어 :
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();
}
답변
abstract
수업 만 가능abstract
회원 .- 비
abstract
클래스한다는로부터 상속abstract
클래스 해야override
그abstract
구성원. abstract
멤버는 암시 적이다virtual
.abstract
멤버는 구현 (제공 할 수 없다abstract
라고pure virtual
일부 언어에서).
답변
항상 추상 함수를 재정의해야합니다.
그러므로:
- 추상 함수 – 상속자가 자체 구현을 제공해야하는 경우
- 가상 – 상속자가 결정해야 할 때
답변
추상 기능 :
- 추상 클래스 내에서만 선언 할 수 있습니다.
- 추상 클래스의 구현이 아닌 메소드 선언 만 포함합니다.
- 파생 클래스에서 재정의해야합니다.
가상 기능 :
- 비 추상 클래스뿐만 아니라 추상 내부에도 선언 할 수 있습니다.
- 메소드 구현을 포함합니다.
- 재정의 될 수 있습니다.
답변
추상 메서드 : 클래스에 추상 메서드가 포함 된 경우 해당 클래스는 추상으로 선언해야합니다. 추상 메소드에는 구현이 없으므로 해당 추상 클래스에서 파생 된 클래스는이 추상 메소드에 대한 구현을 제공해야합니다.
가상 메소드 : 클래스는 가상 메소드를 가질 수 있습니다. 가상 메소드에는 구현이 있습니다. 가상 메서드가있는 클래스에서 상속하면 가상 메서드 를 재정의하고 추가 논리를 제공하거나 논리를 자신의 구현으로 바꿀 수 있습니다.
사용시기 : 경우에 따라 특정 유형에 특정 방법이 있어야한다는 것을 알고 있지만이 방법에 어떤 구현이 필요한지 알 수 없습니다.
이러한 경우이 서명이있는 메소드가 포함 된 인터페이스를 작성할 수 있습니다. 그러나 그러한 경우가 있지만 해당 인터페이스의 구현 자에게 또 다른 일반적인 메소드 (이미 구현을 제공 할 수있는)가 있음을 알고 있으면 추상 클래스를 작성할 수 있습니다. 그런 다음이 추상 클래스에는 추상 메소드 (오버라이드해야 함)와 ‘공통’논리를 포함하는 다른 메소드가 포함됩니다.
직접 사용할 수는 있지만 상속자가 특정 동작을 변경할 수 있기를 원하지만 필수는 아니지만 가상 메서드를 사용해야합니다.
답변
설명 : 유추로. 잘하면 그것은 당신을 도울 것입니다.
문맥
나는 건물의 21 층에서 일합니다. 그리고 나는 불에 대한 편집증입니다. 세상 어딘가에서 불이 하늘 긁는 도구를 태우고 있습니다. 그러나 운 좋게도 화재시해야 할 일에 대한 지침서가 여기 있습니다.
비상 계단()
- 소지품을 수집하지 마십시오
- 화재 탈출을 걸어
- 건물 밖으로 걸어
기본적으로 FireEscape () 라는 가상 메소드입니다.
가상 방법
이 계획은 상황의 99 %에 매우 적합합니다. 작동하는 기본 계획입니다. 그러나 화재 탈출구가 막히거나 손상 될 가능성이 1 %입니다.이 경우 완전히 조여져 과감한 조치를 취하지 않으면 축배가됩니다. 가상 메소드를 사용하면 다음과 같이 할 수 있습니다. 기본 버전의 FireEscape () 계획을 자체 버전의 계획으로 재정의 할 수 있습니다.
- 창으로 실행
- 창문 밖으로 뛰어
- 바닥에 안전하게 낙하산
즉, 가상 메소드는 기본 계획을 제공하며, 필요한 경우 대체 할 수 있습니다 . 프로그래머가 적절하다고 생각하면 서브 클래스는 부모 클래스의 가상 메소드를 대체 할 수 있습니다.
추상 방법
모든 조직이 잘 훈련 된 것은 아닙니다. 일부 조직은 소방 훈련을하지 않습니다. 그들은 전반적인 탈출 정책이 없습니다. 모든 사람은 자신을위한 것입니다. 경영진은 기존 정책에만 관심이 있습니다.
즉, 각 사람은 자신의 FireEscape () 메소드를 개발 해야 합니다. 한 사람이 화재 탈출구를 걸어 나갑니다. 다른 사람은 낙하산을 씁니다. 다른 사람은 로켓 추진 기술을 사용하여 건물에서 날아갑니다. 다른 사람이 밖으로 나옵니다. 기본 FireEscape () 계획이있는 한 경영진은 어떻게 탈출 해야하는지 신경 쓰지 않습니다. 그렇지 않은 경우 OHS가 벽돌처럼 조직에 쓰러 질 것입니다. 이것이 추상적 방법입니다.
이 둘의 차이점은 무엇입니까?
추상 메소드 : 하위 클래스는 자체 FireEscape 메소드를 구현 해야 합니다. 가상 메소드를 사용하면 기본 계획이 기다리고 있지만 충분하지 않은 경우 직접 구현 하도록 선택할 수 있습니다 .
이제 그렇게 힘들지 않습니까?