방법을 기본적으로 하지 가상 있습니다. 인터페이스 정의에 정의 된 계약의 구현을 제공하는 것일뿐입니다. 메서드를 virtual
으로 표시하면 정의 된대로 계약을 계속 준수하면서 파생 클래스가 추가 또는 개별 구현을 제공 할 수 있습니다.
interface IAnimal
{
string Speak();
}
class Dog : IAnimal
{
public string Speak()
{
return "Bark!";
}
}
Dog
클래스 계약 IAnimal
의 구현을 제공함으로써 인터페이스를 구현 :
이 예를 생각해 보자. 여기에는 가상 메서드가없고 우선 적용되지 않습니다.
interface IAnimal
{
string Speak();
}
class Dog : IAnimal
{
public virtual string Speak()
{
return "Bark!";
}
}
class GoldenRetriever : Dog
{
public override string Speak()
{
return "I am a golden retriever who says "
+ base.Speak();
}
}
는 이제
Dog
클래스를 추가하거나 새로운 구현을 제공하는 파생 클래스 허용
virtual
로
Speak
을 선언했다 :
지금이 예제를 고려하십시오. Speak
메서드를 호출해도 여전히 문자열이 반환되므로 IAnimal
으로 계약을 위반하지 않습니다.
네, 마지막 예. 인터페이스는 구현을 필요로하지 않는다는 것을 기억하십시오 - 계약 만 만족하면됩니다. 즉, 인터페이스는 구현 클래스에 일치하는 서명이있는 멤버 만 존재한다는 것을 의미합니다. 이것은 우리가 또한이 작업을 수행 할 수 있음을 의미 :
interface IAnimal
{
string Speak();
}
abstract class Dog : IAnimal
{
public abstract string Speak();
}
class GoldenRetriever : Dog
{
public override string Speak()
{
return "I am a golden retriever";
}
}
공지 사항 지금 Dog
클래스는 모든 Speak
에 대한 구현을 제공하지 않는다는 점 아직 계약의 요구 사항을 만족하고있다.
인터페이스도 클래스에서 클래스로 상속되므로 위의 모든 예제에서 Dog
및 GoldenRetriever
은 모두 IAnimal
인터페이스를 구현합니다. 어떤 클래스도 Speak
메서드를 숨 깁니다. 두 클래스 모두 은입니다.
사실, 가상 클래스가 클래스가 아니라 인터페이스에 정의되어 있다는 혼란이있을 수 있습니다.여기에 내가 위에서 정의 된 인터페이스의 IL은 다음과 같습니다
.class private interface abstract auto ansi IAnimal
{
.method public hidebysig newslot abstract
virtual instance string Speak() cil managed
{
}
}
당신이 여기 유형은 interface
로 지정된 것을 알 필요가 virtual
같은 방법이 정의되어 있는지 정확하지만. 이것은 순수하게 Microsoft의 C# 컴파일러에서 생성 된 MSIL의 구현 세부 사항입니다. 다른 컴파일러는 의미 론적으로 동일한 결과를 제공하는 한 다른 코드를 쉽게 생성 할 수있었습니다.
여기서 중요한 것은 인터페이스에 virtual
이라는 메서드가 선언되어 있어도 클래스에 선언 된 virtual
메서드와 동일한 것을 의미하지는 않습니다.
가상의 인터페이스 대신 인터페이스의 메소드가 기본적으로 추상이라고 가정하면보다 의미가 있습니다. –
네, 괜찮습니다.하지만 일단 컴파일러가 메소드에 가상을 첨부하면 메서드를 구현하는 동안 다시 가상을가집니다. 그러면 컴파일러는 원래 선언을 숨기고 있다고 말해야합니다. –