얼핏 보면 인터페이스 구현과 가상 메소드 오버라이드의 차이가 없어 보이지만 실제로는 인터페이스 구현과 오버라이딩의 차이가 있습니다. 가상 메소드는 매우 큽니다! ! !
인터페이스에 선언된 멤버 메서드는 기본적으로 가상 메서드가 아닙니다. 따라서 파생 클래스는 인터페이스를 구현하는 기본 클래스를 재정의할 수 없습니다. 인터페이스. 가상이 아닌 멤버 .
예를 들어보세요.
인터페이스 ITest 정의:
public interface ITest { void Test(); }
인터페이스를 구현하는 기본 클래스 및 파생 클래스
public class Base:ITest { public Base() { Console.WriteLine("This is base constructor"); } //实现ITest接口 public void Test() { Console.WriteLine("This is in base to ITest implement"); } } public class Derive :Base,ITest { public Derive() { Console.WriteLine("This is derived constructor"); } //测试Derive类实现了ITest吗?? public void Test() { Console.WriteLine("This is in Derive to ITest implement"); } }
Object호출 및 파생:
Base b = new Base(); b.Test(); Base d = new Derive();//将d声明为Base对象 d.Test(); Console.ReadLine();
출력 결과는 다음과 같습니다.
인스턴스 b와 d의 Test 메소드로 구현된 동작이 베이스에 위치함을 알 수 있습니다. 수업! ! ! 이는 파생 클래스가 기본 클래스에서 인터페이스를 구현하는 멤버(가상이 아닌 메서드)를 재정의할 수 없음을 보여줍니다.
그러나 다음 호출을 참조하세요.
Base b = new Base(); b.Test(); Derive d = new Derive(); //将d声明为Derive对象 d.Test(); Console.ReadLine();
출력 결과는 다음과 같습니다.
따라서 이 을 상속하는 객체가 인터페이스 구현 메서드를 호출하려는 경우 다음을 수행할 수 있습니다. Derive 인스턴스로만 선언하세요. 이는 C#의 변수가 기본 인스턴스로 선언된다는 원칙을 준수하지 않습니다! ! ! 파생 클래스 메서드 성격, 기본 클래스 메서드를 가상 메서드로 변환
public class Base:ITest { public Base() { Console.WriteLine("This is base constructor"); } public virtual void Test() //实现ITest接口的虚方法 { Console.WriteLine("This is in base to ITest implemnt"); } } public class Derive :Base,ITest { public Derive() { Console.WriteLine("This is derived constructor"); } public override void Test() //实现接口ITest的复写方法 { Console.WriteLine("This is in Derive to ITest implemnt"); } }
public interface ITest { void Test(); } public class Base:ITest { public Base() { Console.WriteLine("This is base constructor"); } public void Test() { Console.WriteLine("This is in base to ITest implemnt"); } } public class Derive :Base,ITest { public Derive() { Console.WriteLine("This is derived constructor"); } }
요약:
1. 파생은 인터페이스의 가상이 아닌 멤버를 재정의할 수 없습니다.2. 파생 클래스 메서드가 개인화된 메서드인 경우 기본 클래스 메서드를 가상 메서드로 변환합니다.
3. 기본 클래스가 인터페이스 메서드를 구현하는 경우 파생 클래스도 이 인터페이스를 명시적으로 상속하지만 다시 구현할 필요는 없습니다. ! !
위 내용은 C# 디자인 패턴 - 비가상 인터페이스 트랩을 구현하기 위한 파생 클래스에 대한 예제 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!