이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 18805|회답: 0

[통신] C#에서 가상 추상과 (추상) 추상, 인터페이스 간의 유사점과 차이점...

[링크 복사]
게시됨 2019. 4. 22. 오후 2:41:09 | | |
해석 1

C#에서는 추상과 가상 개념이 상속과 관련되어 혼란스럽고, 덮어쓰기 사용이 포함되어 있습니다. 두 가지 차이점을 살펴보겠습니다:

1. 가상 방법

가상 키워드는 기본 클래스의 메서드를 수정하는 데 사용됩니다. 가상 개념이 사용되는 두 가지 상황이 있습니다:

시나리오 1: 기본 클래스에서 가상 메서드가 정의되었으나, 파생 클래스에서는 가상 메서드가 다시 작성되지 않습니다. 파생 클래스 인스턴스에 대한 호출에서 가상 메서드는 기본 클래스가 정의한 메서드를 사용합니다.

시나리오 2: 기본 클래스에서 가상 메서드가 정의된 후, 파생 클래스에서 오버라이드를 사용해 메서드를 다시 작성합니다. 파생 클래스 인스턴스에 대한 호출에서 가상 메서드는 파생 재작성 메서드를 사용합니다.

2. 추상적 방법(추상적 방법)

추상 키워드는 메서드를 수정하기 위해 추상 클래스에서만 사용할 수 있으며, 특정 구현은 없습니다. 추상 메서드의 구현은 파생 클래스의 오버라이드 키워드를 사용하여 구현되어야 합니다.

인터페이스와 추상 클래스의 가장 본질적인 차이점은 추상 클래스가 불완전 클래스인 객체의 추상화인 반면, 인터페이스는 행동 규범입니다.


3. 키워드

정적: 메서드가 정적으로 선언되면 그 메서드는 정적 메서드가 되며, 컴파일러는 컴파일 시점에 메서드 구현을 유지합니다. 즉, 메서드는 클래스에 속하지만, 클래스의 인스턴스가 존재하든 없든 어떤 멤버에도 속하지 않습니다. Static void Main이라는 진입 함수와 마찬가지로, 정적 함수이기 때문에 직접 호출할 수 있습니다.

버추어: 메서드가 Virtual로 선언되면, ClassName 변수 = new ClassName()을 사용하기 전까지는 가상 메서드입니다; 클래스의 인스턴스를 선언하기 전에는 실제 메모리 공간에 존재하지 않습니다. 이 키워드는 클래스 상속에서 클래스 메서드에 대한 다형성 지원을 제공하기 위해 매우 흔히 사용됩니다.

overrride: 재작성됨을 나타냅니다. 이 클래스는 Shape 클래스에서 상속받습니다.
가상, 추상은 그로부터 상속하려는 다른 클래스에게 이 메서드나 속성을 무시할 수 있다고 알려주는 것입니다. 그렇지 않으면 허용되지 않습니다.
추상: 추상 메서드 선언은 파생 클래스에 의해 덮어써야 하는 메서드로, 이를 상속하기 위해 사용됩니다; 실현 없이 상상의 방법으로 볼 수 있다; 클래스가 추상 메서드를 포함한다면, 그 클래스는 다른 일반 메서드를 포함하든 없든 추상 클래스로 정의되어야 합니다; 추상적 클래스는 실체를 가질 수 없다.

a) 가상 수정의 메서드는 메서드 구현을 가져야 하며(비록 두 개의 브레이스만 있더라도), 추상적 수정의 메서드는 구현을 가질 수 없다.

b) 가상 개념은 하위 클래스에 의해 재작성될 수 있으며, 추상은 하위 클래스에 의해 다시 작성되어야 합니다

c) 클래스 내 함수가 abstact에 의해 수정될 경우, 클래스 이름도 abstact로 수정해야 합니다

d) 추상화된 수정된 클래스는 인스턴스로 생성될 수 없습니다.

e) C#의 메서드가 서브클래스의 부모 클래스를 다시 작성할 준비가 되어 있다면, 부모 클래스에는 virtual을, 서브클래스에는 오버라이드를 추가하여 프로글러가 실수로 서브클래스의 부모 메서드를 다시 작성하지 않도록 수정해야 합니다.

참고: 추상으로 수정된 클래스는 상속될 수 있고 인스턴스화할 수 없습니다.

해석 2

가상 클래스와 추상 클래스 모두 부모 클래스를 수정하는 데 사용되며, 부모 클래스의 정의를 덮어써 자식 클래스를 재정의할 수 있습니다.

이들은 한 가지 공통점이 있습니다: 메서드를 수정하는 데 사용될 경우 앞에 공개 메서드를 추가해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다: 가상 메서드나 추상 메서드는 비공개가 될 수 없습니다. 결국 가상 또는 추상을 추가하면 서브클래스가 재정의될 수 있고, 서브클래스가 개인 멤버에 접근할 수 없기 때문입니다.

하지만 그들은 매우 다릅니다. (가상 개념은 "가상"이며, 추상은 "추상"입니다).

(1) 가상 수정 방법은 구현되어야 하며(대괄호 한 쌍만 추가하더라도), 추상 수정 방법은 구현되지 않아야 한다. 예를 들어, 가상 수정 방법이 구현되지 않은 경우:

오류: "Test1.fun1()"은 추상적, 외부적, 부분적이라고 표시되지 않으므로 본문을 선언해야 합니다   

추상적 수정자에 대해, 구현된다면:


오류: "Test2.fun2()"는 본문이 추상으로 표시되어 있어 선언할 수 없습니다   

(2) 가상 개념은 하위 클래스에 의해 다시 작성될 수 있으며, 추상은 하위 클래스에 의해 다시 작성되어야 한다.
컴파일 시 오류가 없습니다. 가상 수정자 메서드가 다시 작성되면 그 앞에 오버라이드가 추가되어야 하며(이 경우 컴파일러에게 가상 메서드를 다시 작성하려 한다는 신호), 구현이 있어야 하며, 그렇지 않으면 컴파일이 잘못됩니다:
(3) 클래스 멤버가 추상에 의해 수정될 경우, 추상은 클래스 앞에 추가되어야 합니다. 추상 메서드를 가질 수 있는 것은 추상 클래스뿐이기 때문입니다.

(4) 추상 클래스의 인스턴스는 생성할 수 없으며, 상속만 가능하며 인스턴스화할 수 없습니다. 예를 들어, BaseTest2 base2 base2 = new BaseTest2(); 컴파일 오류가 발생할 수 있습니다: 추상 클래스나 인터페이스가 인스턴스를 생성할 수 없습니다.

(5) C#에서는 서브클래스의 메서드를 다시 작성하고 싶다면, 부모 메서드 앞에 virtual을 추가하고 서브클래스 메서드 앞에 덮어써야 합니다. 이는 프로그래머가 서브클래스 내 부모 메서드를 실수로 다시 작성하는 것을 방지하기 위함입니다.

(6) 추상 메서드는 덮어써야 하며, 가상 메서드는 구현이 있어야 합니다(추상 클래스에서 정의된 메서드라도).
해석 3
유사점:
1. 모두 상속될 수 있다
2. 이들 중 어느 것도 인스턴스화할 수 없다
3. 메서드 선언을 포함할 수 있습니다
4. 파생 클래스는 실현되지 않은 메서드를 구현해야 합니다
구별하다:
1. 추상 기본 클래스는 필드, 속성, 메서드 구현을 정의할 수 있습니다. 인터페이스는 속성, 인덱서, 이벤트, 메서드 선언만 정의할 수 있으며 필드를 포함할 수 없습니다.
2. 추상 클래스는 불완전한 클래스로서 더 정제되어야 하며, 인터페이스는 행동 규범입니다. 마이크로소프트의 맞춤형 인터페이스는 항상 "내가 할 수 있다..."라는 표현임을 증명하는 적절한 필드를 제공합니다. ”
3. 인터페이스는 여러 번 구현할 수 있으며, 추상 클래스는 한 사람에게만 상속될 수 있습니다
4. 추상적 클래스는 밀접하게 관련된 클래스들 사이에서 더 많이 정의되며, 대부분의 인터페이스는 느슨하게 관련되어 있지만 모두 특정 함수를 구현합니다
5. 추상적 클래스는 일련의 관련 객체에서 추상화된 개념으로, 사물의 내부 공통성을 반영한다; 인터페이스는 외부 호출을 만족시키기 위해 정의된 함수적 관습으로, 사물의 외부 특성을 반영합니다
6. 인터페이스는 기본적으로 상속의 특정 특성을 가지지 않으며, 단지 호출할 수 있는 메서드를 약속할 뿐입니다
7. 인터페이스는 콜백을 지원할 수 있지만, 상속에는 이 기능이 없습니다
8. 추상 클래스가 구현하는 특정 메서드는 기본적으로 가상 메서드이지만, 인터페이스를 구현하는 클래스 내 인터페이스 메서드는 기본적으로 비가상 메서드이며, 물론 가상 클래스로 선언할 수도 있습니다
9. 추상 클래스가 인터페이스를 구현한다면, 인터페이스 내 메서드는 추상 메서드로 매핑할 수 있으나, 인터페이스 내 메서드는 추상 클래스의 서브클래스에 구현할 수 있습니다
사용 규칙:
1. 추상 클래스는 주로 밀접한 관련 객체에 사용되며, 인터페이스는 관련 없는 클래스에 대한 일반 기능을 제공하는 데 가장 적합합니다
2. 큰 함수형 단위를 설계하고 싶다면 추상 클래스를 사용하세요; 작고 간결한 기능 블록을 설계하고 싶다면 인터페이스를 사용하세요.
3. 컴포넌트의 여러 버전이 생성될 예정이라면, 추상 클래스를 생성합니다. 한 번 인터페이스가 생성되면 변경할 수 없습니다. 인터페이스의 새로운 버전이 필요하다면, 완전히 새로운 인터페이스를 만들어야 합니다.
4. 생성된 함수가 다양한 이기종 객체 사이에서 사용될 경우, 인터페이스를 사용하세요; 모든 컴포넌트 구현에서 공통 구현 기능을 제공하고 싶다면 추상 클래스를 사용하세요.
5. 객체를 분석하고, 내부 공통성을 정제하여 추상적 클래스를 형성하는데, 이는 객체의 본질, 즉 '무엇'을 표현하는 데 사용된다. 외부 호출이나 함수를 확장해야 할 때 인터페이스가 우선순위를 둡니다
6. 좋은 인터페이스 정의는 다기능 기준이 아니라 구체적이고 기능적이어야 하며, 그렇지 않으면 인터페이스 오염을 초래할 수 있습니다. 클래스가 인터페이스의 한 기능만 구현하고 인터페이스 내 다른 메서드를 구현해야 하는 경우, 이를 인터페이스 오염이라고 합니다
7. 형성 함수를 달성하기 위해 상속을 사용하지 말고, 블랙박스 다중화, 즉 객체 결합을 사용하세요. 상속 단계의 수가 증가함에 따라, 가장 직접적인 결과는 이 분류군에서 클래스를 호출할 때 모두 스택에 불러와야 한다는 점입니다! 그 결과는 상상할 수 있다. (스택 원리 이해와 결합됨). 동시에, 관심 있는 친구들은 마이크로소프트가 클래스를 만들 때 종종 객체 결합 방식을 사용한다는 점을 알아차릴 수 있습니다. 예를 들어, asp.net 에서 페이지 클래스는 서버 요청(Server Request)과 같은 속성을 가지지만, 실제로는 모두 특정 클래스의 객체입니다. 페이지 클래스의 이 객체를 사용해 다른 클래스의 메서드와 속성을 호출하는 것은 매우 기본적인 설계 원칙입니다
예를 들어:
윈도우 폼은 추상 클래스로 설계할 수 있으며, 공개 연산과 속성은 추상 클래스에 배치되어 폼과 대화 상자가 이 추상 클래스에서 상속받아 필요에 따라 확장 및 개선할 수 있습니다.

인쇄 작업은 각 폼에 인터페이스로 제공할 수 있는데, 폼의 내용이 다르기 때문에 각 폼이 자체 요구사항에 따라 인쇄 기능을 구현해야 하기 때문입니다. 인쇄 시에는 어떤 양식이 인쇄되든 인터페이스에서만 호출됩니다.

공통성, 개성, 선택:
몇몇 책에서는 C#이 추상 기저 클래스 대신 인터페이스를 사용할 것을 권장하며, 인터페이스 사용의 많은 이점을 강조한다고 합니다. 저도 위 목록에서 두 클래스 간에 여전히 많은 차이점이 있으며, 이러한 차이의 존재가 적용 가능한 상황에서 차이를 결정해야 합니다. 예를 들어, 추상 기저 클래스는 일부 메서드에 대해 기본 구현을 제공하여 서브클래스에서 반복 구현을 방지하고 코드의 재사용성을 높일 수 있습니다. 이것이 추상 클래스의 장점이다; 인터페이스는 추상 메서드만 포함할 수 있습니다. 추상 기본 클래스를 언제 사용할지, 언제 인터페이스를 사용할지에 대해서는, 사용자가 상속된 클래스 간 연결을 어떻게 바라보는지, 즉 성격 차이인지 공통 연결인지에 따라 다릅니다. 인생 사례를 들어 설명해 보겠습니다.

만약 사람, 물고기, 개구리 세 가지 대상이 주어지고, 그들 사이의 연결을 요약하기 위해 기본 범주를 설계하라는 요청을 받는다면, 가장 먼저 느끼는 것은 이들 사이에 큰 차이가 있다는 것이고, 그 공통점을 추상화하기 어렵다는 것입니다. 이 부분에서 추상 기초 클래스 대신 인터페이스를 사용하는 것을 고려해야 할 이유는 세 가지입니다:
1. 개별성은 공통성보다 크다.
2. 큰 차이가 있는 성격들은 일부 유사한 행동을 보인다.
3. 동일한 행동의 실현 방법에 큰 차이가 있다.
이때 세 가지 객체, 즉 크루시안 잉어, 잉어, 금붕어가 추가로 주어지고, 기본 클래스를 설계해 이들 간의 연관성을 요약할 수 있습니다. 그러면 가장 먼저 깨닫는 것은 모두 물고기에 속한다는 것이고, 두 번째는 수영 방식이 약간 다를 수 있으니 인터페이스 대신 추상적인 기본 클래스를 사용해야 한다는 점입니다. 위 예시와 비교할 때, 세 가지 이유가 있습니다:
1. 공통성은 개별성보다 크다
2. 동일한 공통점을 가진 개인들은 동일한 속성과 행동을 가져야 한다
3. 동일한 행동의 구현 방법에 특정 차이가 있습니다
인터페이스나 추상 기저 클래스를 사용하는 여러 이유 중 세 번째는 사실 동일한데, 이는 객체지향에서의 다형성 개념을 설명합니다. 즉, 부모 클래스를 덮어쓰고 런타임에 전달된 객체 참조에 따라 해당 메서드를 호출함으로써 구현됩니다. 두 번째 이유는 차이가 나기 시작하는데, 인터페이스는 상속된 객체 간 동일한 동작을 강조하는 반면, 추상 클래스는 상속된 객체 간의 동일한 특성을 강조합니다. 인터페이스와 추상 기저 클래스를 진정으로 구분 짓는 이유는 다음과 같습니다:

인터페이스는 큰 차이가 있는 객체들 간의 기능적 공통성을 추구할 때 사용됩니다.
추상적 기저 클래스는 더 공통성을 가진 객체 간 함수적 차이를 찾을 때 사용됩니다.
동일하고 다른 클래스를 비교해 보면, 인터페이스와 추상 클래스는 각각 강점이 있지만 장점은 없다고 말할 수 있습니다. 실제 프로그래밍 실습에서는 특정 상황에 따라 재능을 측정해야 하지만, 이와 같은 경험과 축적이 영감을 줄 수 있을 것입니다. 제 경험 외에도 많은 부분이 고전에서 왔기 때문에 시험을 견딜 수 있다고 믿습니다. 그래서 규칙과 행사에서 우리는 이 고전들을 배우고, 가장 중요한 것은 우리가 배운 것을 적용하는 것입니다. 물론 가족의 말로 모두의 웃음을 이끌어낼 것입니다. 계속해 주세요.

규칙 및 행사:
1. 객체지향 사고의 가장 중요한 원칙 중 하나는 인터페이스 지향 프로그래밍임을 기억하세요.
2. 인터페이스와 추상 클래스의 도움으로 23가지 디자인 패턴의 많은 아이디어가 영리하게 구현되었으며, 본질은 단순히 추상 프로그래밍에 지향되어 있다는 점이라고 생각합니다.
3. 추상 클래스는 주로 밀접한 관련 객체에 사용되어야 하며, 인터페이스는 관련 없는 클래스에 대한 일반적인 기능을 제공하는 데 가장 적합합니다.
4. 인터페이스는 CAN-DO 관계 유형에 집중하는 반면, 추상 클래스는 IS-A 관계에 초점을 맞춥니다.
5. 인터페이스 내 다중 정의 객체의 동작; 추상 클래스는 객체의 속성을 다중 정의합니다;
6. 인터페이스 정의는 공용, 보호, 내부 및 사설 수정자를 사용할 수 있지만, 거의 모든 인터페이스는 공용으로 정의되어 있으므로 더 설명할 필요가 없습니다.
7. "인터페이스는 변하지 않는다"는 점이 중요한 고려 사항입니다. 따라서 인터페이스에서 확장을 추가할 때는 기존 인터페이스가 아니라 새로운 인터페이스를 추가해야 합니다.
8. 인터페이스를 단일 함수로 설계해 보세요. 예를 들어 .NET 프레임워크를 들면 IDisposable, IDisposable, IComparable, IEquatable, IEnumerable 등은 모두 하나의 공통 메서드만 포함합니다.
9. 인터페이스 이름 앞에 있는 대문자 "I"는 관습이며, 필드 이름이 밑줄로 시작하는 것과 마찬가지로 이 원칙을 준수해 주십시오.
10. 인터페이스에서 모든 메서드는 기본적으로 퍼블릭으로 설정됩니다.
11. 버전 문제가 예상된다면 "추상 클래스"를 생성할 수 있습니다. 예를 들어, 개, 닭, 오리를 만든다면, 미래에 발생할 수 있는 상황을 대비하기 위해 동물을 추상화하는 것을 고려해야 합니다. 인터페이스에 새로운 멤버를 추가하면 모든 파생 클래스가 수정되고 재컴파일되어야 하므로, 버전 관리 문제는 추상 클래스로 구현하는 것이 가장 좋습니다.
12. 추상 클래스에서 파생된 비추상 클래스는 모든 상속된 추상 메서드와 추상 접근자의 실제 구현을 포함해야 합니다.
13. 새로운 키워드는 추상 클래스에 사용할 수 없으며, 추상 클래스를 인스턴스화할 수 없기 때문에 봉인할 수도 없습니다.
14. 정적 또는 가상 수정자는 추상 메서드 선언에 사용할 수 없습니다.





이전의:C# Enum Simple permission Design은 FlagsAttribute 속성을 사용합니다
다음:황용의 이윈 교실은 위챗 미니 프로그램에 대해 제로베이스 이해를 가지고 있습니다
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com