추상 메서드와 가상 메서드의 차이점은 무엇입니까? 어떤 경우에 추상 또는 가상 방법을 사용하는 것이 좋습니까? 어느 것이 가장 좋은 접근 방식입니까?
질문자 :Moran Helman
추상 함수는 기능을 가질 수 없습니다. 기본적으로 모든 자식 클래스는 이 메서드의 자체 버전을 제공해야 하지만 부모 클래스에서 구현하려고 시도하기에는 너무 일반적입니다.
가상 함수 는 기본적으로 보기를 말하는 것입니다. 여기에 자식 클래스에 충분할 수도 있고 좋지 않을 수도 있는 기능이 있습니다. 따라서 충분하다면 이 방법을 사용하고 그렇지 않은 경우 나를 무시하고 고유한 기능을 제공하십시오.
BFree
추상 함수는 구현이 없으며 추상 클래스에서만 선언할 수 있습니다. 이것은 파생 클래스가 구현을 제공하도록 강제합니다.
가상 함수는 기본 구현을 제공하며 추상 클래스 또는 비추상 클래스에 존재할 수 있습니다.
예를 들면 다음과 같습니다.
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(); }
JoshBerke
- 만
abstract
클래스를 가질 수abstract
회원. - 비
abstract
에서 상속 클래스abstract
클래스가 있어야override
의abstract
회원. -
abstract
멤버는 암시적으로virtual
입니다. -
abstract
멤버는 구현을 제공할 수 없습니다(일부 언어에서는abstract
pure virtual
이라고 함).
mmx
항상 추상 함수를 재정의해야 합니다.
따라서:
- 추상 함수 - 상속자가 자체 구현을 제공해야 하는 경우
- 가상 - 상속인이 결정할 때
Rinat Abdullin
추상 기능:
- 추상 클래스 내에서만 선언할 수 있습니다.
- 추상 클래스의 구현이 아닌 메서드 선언만 포함합니다.
- 파생 클래스에서 재정의해야 합니다.
가상 기능:
- 추상 클래스와 비 추상 클래스 내에서 선언할 수 있습니다.
- 여기에는 메서드 구현이 포함되어 있습니다.
- 재정의될 수 있습니다.
Lexnim
설명: 유추와 함께. 잘하면 도움이 될 것입니다.
문맥
나는 건물의 21층에서 일한다. 그리고 저는 불에 대해 편집증적입니다. 이따금 세계 어딘가에서 불이 하늘 스크레이퍼를 태우고 있습니다. 하지만 다행히 여기 어딘가에 화재 발생 시 대처 방법에 대한 사용 설명서가 있습니다.
비상 계단()
- 소지품을 수집하지 마십시오
- 화재 대피소로 이동
- 건물 밖으로 도보
이것은 기본적으로 FireEscape() 라는 가상 메서드입니다.
가상 방법
이 계획은 99%의 상황에서 꽤 좋습니다. 작동하는 기본 계획입니다. 그러나 화재 탈출구가 막히거나 파손될 확률은 1%입니다. 이 경우 과감한 조치를 취하지 않으면 완전히 망하고 축배가 될 것입니다. 가상 메서드를 사용하면 다음과 같이 할 수 있습니다. 기본 FireEscape() 계획을 자체 버전의 계획으로 재정의할 수 있습니다.
- 창으로 실행
- 창 밖으로 뛰어
- 바닥까지 안전하게 낙하산
즉, 가상 메서드는 기본 계획을 제공하며 필요한 경우 재정의할 수 있습니다 . 프로그래머가 적절하다고 판단하는 경우 하위 클래스는 상위 클래스의 가상 메서드를 재정의할 수 있습니다.
추상 방법
모든 조직이 제대로 훈련된 것은 아닙니다. 일부 조직은 소방 훈련을 하지 않습니다. 그들은 전반적인 탈출 정책을 가지고 있지 않습니다. 모든 사람은 자신을 위한 것입니다. 경영진은 존재하는 그러한 정책에만 관심이 있습니다.
즉, 각 사람은 자신의 FireEscape() 메서드를 개발 해야 합니다. 한 남자가 비상구 밖으로 걸어 나갈 것입니다. 다른 사람이 낙하산을 할 것입니다. 다른 사람은 로켓 추진 기술을 사용하여 건물에서 멀리 날아갈 것입니다. 다른 녀석이 빠져나갈 것입니다. 기본 FireEscape() 계획이 있는 한 경영진은 탈출 방법 을 신경 쓰지 않습니다. 그렇지 않으면 OHS가 벽돌 1톤처럼 조직에 내려올 것이라고 보장할 수 있습니다. 이것이 추상 메소드가 의미하는 것입니다.
둘의 차이점은 다시 무엇입니까?
추상 메서드: 하위 클래스는 강제 로 자체 FireEscape 메서드를 구현해야 합니다. 가상 방법을 사용하면 기본 계획이 기다리고 있지만 충분하지 않은 경우 직접 구현하도록 선택할 수 있습니다.
이제 그렇게 어렵지 않았습니까?
BenKoshy
추상 메서드: 클래스에 추상 메서드가 포함되어 있으면 해당 클래스를 추상으로 선언해야 합니다. 추상 메서드에는 구현이 없으므로 해당 추상 클래스에서 파생된 클래스는 이 추상 메서드에 대한 구현을 제공해야 합니다.
가상 메서드: 클래스는 가상 메서드를 가질 수 있습니다. 가상 메서드에는 구현이 있습니다. 가상 메서드가 있는 클래스에서 상속할 때 가상 메서드 를 재정의하고 추가 논리를 제공하거나 논리를 고유한 구현으로 바꿀 수 있습니다.
언제 무엇을 사용해야 하는지: 어떤 경우에는 특정 유형에 특정 메소드가 있어야 한다는 것을 알고 있지만 이 메소드에 어떤 구현이 있어야 하는지 모릅니다.
이러한 경우 이 서명이 있는 메서드가 포함된 인터페이스를 만들 수 있습니다. 그러나 그러한 경우가 있지만 해당 인터페이스의 구현자가 다른 공통 메서드(이미 구현을 제공할 수 있음)도 있다는 것을 알고 있다면 추상 클래스를 만들 수 있습니다. 그런 다음 이 추상 클래스에는 재정의해야 하는 추상 메서드와 '공통' 논리가 포함된 다른 메서드가 포함됩니다.
직접 사용할 수 있지만 필수는 아니지만 상속자가 특정 동작을 변경할 수 있도록 하려는 클래스가 있는 경우 가상 메서드를 사용해야 합니다.
Frederik Gheysels
추상 메서드는 구체적인 클래스를 만들기 위해 구현해야 하는 메서드입니다. 선언은 추상 클래스에 있으며(추상 메서드가 있는 모든 클래스는 추상 클래스여야 함) 구체적인 클래스에서 구현되어야 합니다.
가상 메서드는 재정의를 사용하여 파생 클래스에서 재정의할 수 있는 메서드로 슈퍼클래스의 동작을 대체합니다. 재정의하지 않으면 원래 동작을 얻습니다. 그렇게 하면 항상 새로운 동작을 얻게 됩니다. 이것은 재정의할 수 없지만 원래 메서드를 숨길 수 있는 가상 메서드가 아닌 것과 반대입니다. new
modifier를 사용하여 수행됩니다.
다음 예를 참조하십시오.
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
호출하면 "Hi There"와 "See you later"가 표시됩니다. HelloGoodbye
호출하면 "Hello"와 "See you later"가 나옵니다. SayGoodbye
가 가상이고 파생 클래스로 대체될 수 있기 때문입니다. SayHello
는 숨겨져 있기 때문에 기본 클래스에서 호출할 때 원래 메서드를 얻습니다.
추상 메서드는 암시적으로 가상입니다. 인터페이스와 같이 존재해야 하는 동작을 정의합니다.
Kamiel Wanrooij
추상 메서드는 항상 가상입니다. 그들은 구현을 가질 수 없습니다.
이것이 주요 차이점입니다.
기본적으로 가상 메서드의 '기본' 구현이 있고 후손이 동작을 변경할 수 있도록 하려면 가상 메서드를 사용합니다.
추상 메서드를 사용하면 자손이 구현을 제공하도록 강제합니다.
Rashack
(다른 답변에서) 다음 클래스를 일부 개선하여 이 작업을 더 간단하게 만들었습니다.
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"); } } }
MeqDotNet
바인딩 은 이름을 코드 단위에 매핑하는 프로세스입니다.
후기 바인딩 은 이름을 사용하지만 매핑을 연기한다는 의미입니다. 다시 말해, 먼저 이름을 생성/언급하고 일부 후속 프로세스가 해당 이름에 대한 코드 매핑을 처리하도록 합니다.
이제 다음을 고려하십시오.
- 인간에 비해 기계는 검색과 분류를 정말 잘한다.
- 인간은 기계에 비해 발명과 혁신을 정말 잘한다
따라서 짧은 대답은 다음과 같습니다. virtual
은 기계(런타임) abstract
은 인간(프로그래머)에 대한 늦은 바인딩 명령입니다.
즉, virtual
은 다음을 의미합니다.
" 런타임님 , 최선을 다해 검색 하여 적절한 코드를 이 이름에 바인딩하십시오."
반면 abstract
은 다음을 의미합니다.
" 프로그래머 님께, 최선을 다해 적절한 코드를 이 이름에 바인딩하십시오: inventing "
완전성을 위해 오버로딩 은 다음을 의미합니다.
" 컴파일러님 , 최선을 다해 정렬 하여 적절한 코드를 이 이름에 바인딩하십시오."
Rodrick Chapman
상속자가 원하는 경우 기능을 확장하기를 원할 때 기본적으로 가상 메서드를 사용합니다.
상속자가 기능을 구현하기를 원할 때 추상 메서드를 사용합니다(이 경우 선택의 여지가 없음).
Brann
가상 방법 :
가상은 우리가 그것을 재정의할 수 있음을 의미합니다.
가상 기능에는 구현이 있습니다. 클래스를 상속할 때 가상 기능을 재정의하고 자체 논리를 제공할 수 있습니다.
- 구현하는 동안 가상 함수의 반환 유형을 변경할 수 있습니다.
자식 클래스의 기능(개념으로 말할 수 있습니다.
그림자).
추상 방법
Abstract는 우리가 그것을 재정의해야 함을 의미합니다.
추상 함수는 구현이 없으며 추상 클래스에 있어야 합니다.
선언만 가능합니다. 이것은 파생 클래스가 구현을 제공하도록 합니다.
추상 멤버는 암시적으로 가상입니다. 추상은 일부 언어에서 순수 가상으로 호출될 수 있습니다.
public abstract class BaseClass { protected abstract void xAbstractMethod(); public virtual void xVirtualMethod() { var x = 3 + 4; } }
flik
나는 추상 메소드가 아래와 같이 정의된 곳을 보았다. **
"추상 메서드는 자식 클래스에서 구현해야 합니다"
** 와 같다고 느꼈습니다.
자식 클래스도 추상 인 경우 자식 클래스에서 추상 메서드를 구현해야 할 필요는 없습니다.
1) 추상적 인 방법은 개인 방법이 될 캔트. 2) 추상적 인 방법은 같은 추상 클래스에서 구현 될 캔트.
.. 추상 클래스를 구현하는 경우 기본 추상 클래스의 추상 메서드를 재정의해야 합니다. 왜냐하면.. 추상 메소드를 구현하는 것은 오버라이드 키워드로 .Similar to Virtual 메소드입니다.
상속된 클래스에서 가상 메서드를 구현할 필요는 없습니다.
----------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(); } }
Kod
위의 대부분의 예는 코드를 사용하며 매우 훌륭합니다. 그들이 말하는 것에 추가할 필요는 없지만 다음은 코드/기술 용어가 아닌 유추를 사용하는 간단한 설명입니다.
간단한 설명 - 유추를 사용한 설명
추상 방법
조지 W 부시를 생각해 보십시오. 그는 그의 병사들에게 "이라크에서 싸우러 가십시오"라고 말합니다. 그리고 그게 다야. 그가 명시한 것은 싸움을 해야 한다는 것뿐입니다. 그는 그 일이 정확히 어떻게 일어날지 명시하지 않습니다. 그러나 내 말은, 당신은 그냥 나가서 "싸울 수 없습니다": 정확히 무엇을 의미합니까? 나는 B-52 또는 내 derringer로 싸울 수 있습니까? 그 구체적인 내용은 다른 사람에게 맡깁니다. 이것은 추상적인 방법입니다.
가상 방법
David Petraeus는 군대에서 높은 위치에 있습니다. 그는 싸움의 의미를 다음과 같이 정의했습니다.
- 적을 찾아라
- 그를 무력화하십시오.
- 나중에 맥주한잔
문제는 이것이 매우 일반적인 방법이라는 것입니다. 작동하는 좋은 방법이지만 때로는 충분히 구체적이지 않습니다. Petraeus에게 좋은 점은 그의 명령에 여유와 범위가 있다는 것입니다. 그는 다른 사람들이 특정 요구 사항에 따라 "싸움"의 정의를 변경할 수 있도록 허용했습니다.
Private Job Bloggs는 Petraeus의 명령을 읽고 특정 요구 사항에 따라 자신의 전투 버전을 구현할 수 있는 권한을 부여받습니다.
- 적을 찾으십시오.
- 머리에 총을 쏴.
- 집에가
- 맥주를 마신다.
Nouri al Maliki도 Petraeus로부터 같은 명령을 받습니다. 그는 또한 싸울 것입니다. 그러나 그는 보병이 아니라 정치인입니다. 분명히 그는 자신의 정치인의 머리에 총을 쏘고 돌아 다닐 수 없습니다. Petraeus가 그에게 가상 방법을 제공했기 때문에 Maliki는 특정 상황에 따라 자신의 버전의 전투 방법을 구현할 수 있습니다.
- 적을 찾으십시오.
- 그를 일부 BS 트럼프 혐의로 체포하도록 하십시오.
- 집에가
- 맥주를 마신다.
즉, 가상 방법은 상용구 지침을 제공하지만 이는 일반적인 지침이며 특정 상황에 따라 군대 계층에 속한 사람들이 더 구체적으로 만들 수 있습니다.
둘의 차이점
George Bush는 구현 세부 사항을 증명하지 않습니다. 이것은 다른 사람이 제공해야 합니다. 이것은 추상적인 방법입니다.
반면에 페트라 우스는 구현 세부 사항을 제공한다 그러나 그는 더 나은 뭔가를 가지고 올 수 있다면, 자신의 버전으로 자신의 명령을 무시하는 자신의 부하 직원에 대한 권한을 부여하고있다.
도움이 되기를 바랍니다.
BenKoshy
추상 함수(메소드) :
● 추상 메소드는 abstract 키워드로 선언된 메소드이다.
● 본체가 없습니다.
● 파생 클래스에서 구현해야 합니다.
● 메서드가 추상이면 클래스도 추상화되어야 합니다.
가상 함수(메소드):
● 가상 메소드는 virtual 키워드로 선언된 메소드로, override 키워드를 사용하여 파생 클래스 메소드로 재정의할 수 있습니다.
● 재정의할지 여부는 파생 클래스에 달려 있습니다.
Kedarnath M S
대답은 여러 번 제공되었지만 각각을 언제 사용할지에 대한 질문은 디자인 타임 결정입니다. 일반적인 메서드 정의를 별개의 인터페이스로 묶고 적절한 추상화 수준의 클래스로 끌어오는 것이 좋은 방법이라고 생각합니다. 추상 및 가상 메서드 정의의 공통 집합을 클래스에 덤핑하면 간결한 인터페이스 집합을 구현하는 비추상 클래스를 정의하는 것이 가장 좋을 때 클래스를 실체화할 수 없습니다. 항상 그렇듯이 응용 프로그램의 특정 요구 사항에 가장 적합한 것이 무엇인지에 따라 다릅니다.
ComeIn
추상 함수 는 본문을 가질 수 없으며 자식 클래스에 의해 재정의되어야 합니다(MUST).
가상 함수 는 본문을 가지며 자식 클래스에 의해 재정의되거나 재정의되지 않을 수 있습니다.
Yeasin Abedin
일반적인 객체 지향 관점에서:
추상 메서드에 관하여 : 부모 클래스에 추상 메서드를 넣을 때 실제로 자식 클래스에 다음과 같이 말하는 것입니다. 이 같은 메서드 서명이 있습니다. 그리고 그것을 사용하고 싶다면 직접 구현해야 합니다!
가상 기능 관련 : 부모 클래스에 가상 메서드를 넣으면 파생 클래스에 다음과 같이 말합니다. 이것이 당신에게 유용하다면 그것을 사용하십시오. 그렇지 않은 경우 이것을 재정의하고 코드를 구현하십시오. 코드에서 내 구현을 사용할 수도 있습니다!
이것은 일반 OO에서 이 두 개념의 차이점에 대한 몇 가지 철학입니다.
Mohammad Nikravesh
추상 기능은 구현이 없는 "그냥" 서명입니다. 인터페이스에서 클래스를 사용할 수 있는 방법을 선언하는 데 사용됩니다. 파생 클래스 중 하나에서 구현해야 합니다.
가상 함수(실제로는 메서드)도 선언하는 함수이며 상속 계층 클래스 중 하나에서 구현해야 합니다.
이러한 클래스의 상속된 인스턴스는 구현하지 않는 한 하위 계층 클래스에서도 구현을 상속합니다.
Sagi Berco
C++ 배경에서 C# 가상은 C++ 가상에 해당하고 C# 추상 메서드는 C++ 순수 가상 함수에 해당합니다.
Yituo
클래스가 이 추상 클래스에서 파생된 경우 추상 멤버를 재정의해야 합니다. 이는 멤버가 선택적으로 재정의될 수 있음을 지정하는 가상 수정자와 다릅니다.
user7396942
C#에는 가상 클래스를 호출하는 것이 없습니다.
기능용
- 추상 기능에는 서명만 있고 드라이브 클래스는 기능으로 재정의해야 합니다.
- 가상 기능은 요구 사항에 따라 드라이브 클래스가 기능을 재정의할 수도 있고 재정의하지 않을 수도 있습니다.
귀하의 요구 사항에 따라 결정할 수 있습니다.
Nithila Shanmugananthan
추상 메서드에는 구현이 없습니다. 부모 클래스에서 선언됩니다. 자식 클래스는 해당 메서드를 구현할 책임이 있습니다.
가상 메서드는 부모 클래스에 구현이 있어야 하며 자식 클래스가 부모 클래스의 해당 구현을 사용할지 또는 자식 클래스의 해당 메서드에 대해 자체적으로 새 구현을 사용할지 여부를 쉽게 선택할 수 있습니다.
Vinay Chanumolu
추상 함수 또는 메서드 는 클래스에 의해 노출되는 공개 "작업의 이름"이며, 추상 클래스와 함께 그 목적은 주로 개체가 구현해야 하는 구조에 대해 개체 디자인에서 제약 형식을 제공하는 것입니다.
사실 추상 클래스에서 상속하는 클래스는 이 메서드에 구현을 제공해야 합니다. 일반적으로 컴파일러는 그렇지 않을 때 오류를 발생시킵니다.
추상 클래스와 메서드를 사용하는 것은 클래스를 설계할 때 구현 세부 사항에 초점을 맞춤으로써 클래스 구조가 구현과 너무 관련되어 종속성을 만들고 클래스 간에 협력하는 클래스 간의 결합을 피하기 위해 주로 중요합니다.
가상 함수 또는 메서드 는 단순히 클래스의 공개 동작을 모델링하는 메서드이지만 상속 체인에서 자유롭게 수정할 수 있습니다. 왜냐하면 자식 클래스는 해당 동작에 대한 특정 확장을 구현해야 할 수 있다고 생각하기 때문입니다.
둘 다 객체 지향 패러다임에서 다형성의 한 형태를 나타냅니다.
추상 메서드와 가상 기능을 함께 사용하여 좋은 상속 모델을 지원할 수 있습니다.
우리는 솔루션의 주요 개체에 대한 좋은 추상 구조를 설계한 다음 추가 전문화 경향이 있는 항목을 찾아 기본 구현을 만들고 이러한 개체를 가상으로 만듭니다. 마지막으로 기본 구현을 전문화하여 결국 상속된 가상 개체를 "재정의"합니다.
Ciro Corvino
여기에서 인터페이스, 추상 클래스 및 일반 클래스의 동작을 매우 기본적인 수준에서 볼 수 있는 실질적인 예가 되길 바라는 샘플 코드를 작성하고 있습니다. 데모로 사용하려는 경우 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(){ // // } } }
U.Savas
방법은 의무 /부족 및 재정의 허용 /부족에 따라 나눌 수 있습니다.
- 추상(순수)/구체(불순): 재정의해야 함/재정의할 수 없음;
- virtual/real: 재정의될 수 있습니다/무시해서는 안 됩니다.
따라서 정의에 따라 추상 메서드는 가상일 수만 있고 실제 메서드는 구체적일 수 있습니다.
Maggyero
내 이해:
추상적인 방법:
추상 클래스만 추상 메서드를 보유할 수 있습니다. 또한 파생 클래스는 메서드를 구현해야 하며 클래스에 구현이 제공되지 않습니다.
가상 방법:
클래스는 이를 선언하고 동일한 구현을 제공할 수도 있습니다. 또한 파생 클래스는 이를 재정의할 메서드를 구현해야 합니다.
Qaiser
출처 : http:www.stackoverflow.com/questions/391483/what-is-the-difference-between-an-abstract-method-and-a-virtual-method
'etc. > StackOverFlow' 카테고리의 다른 글
"좋아요"로 MongoDB를 쿼리하는 방법 (0) | 2022.01.08 |
---|---|
양식 제출과 같은 JavaScript 게시 요청 (0) | 2022.01.08 |
IDisposable 인터페이스의 적절한 사용 (0) | 2022.01.08 |
<button>대<input type="button" /> . 어느 것을 사용할 것인가?</button> (0) | 2022.01.08 |
JavaScript에서 10진수를 16진수로 변환하는 방법 (0) | 2022.01.08 |