1、C# 接口(interface)
在C#中实现抽象的另一种方法是使用接口(interface)。接口(interface)是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,C#不支持多重继承。有了接口,就可以得到多重继承的效果。下面看一下接口使用示例。
// interface
interface Animal {
void Eat(); // 接口方法(没有实现)
void Run(); // 接口方法(没有实现)
}
要访问接口方法,必须实现接口 (有点像继承的),也是使用:。例如,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace cjavapy { // Interface interface Animal { void Eat(); // 接口方法(没有实现) void Sleep(); // 接口方法(没有实现) } // Cat 实现 Animal 接口 class Cat : Animal { public void Eat() { // 这里提供了eat()的实现 Console.WriteLine("吃鱼"); } public void Sleep() { // 这里提供了sleep()的实现 Console.WriteLine("Zzz"); } } class Program { static void Main(string[] args) { Cat myCat = new Cat(); // 创建Cat对象 myCat.Eat(); myCat.Sleep(); } } }
2、实现多个接口
要实现多个接口,需要用逗号分隔它们:
例如,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace cjavapy { interface FirstInterface { void MyMethod(); // 接口方法 } interface SecondInterface { void MyOtherMethod(); // 接口方法 } class DemoClass : FirstInterface, SecondInterface { public void MyMethod() { Console.WriteLine("myMethod"); } public void MyOtherMethod() { Console.WriteLine("myOtherMethod"); } } class Program { static void Main(string[] args) { DemoClass myObj = new DemoClass(); myObj.MyMethod(); myObj.MyOtherMethod(); } } }
3、虚方法
virtual
关键字用于修饰方法或属性的声明,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写实现。相对于接口,虚方法可以不被重写,定义方法时能够有自己的方法体。虚方法默认是有实现的。例用示例如下,
using System; namespace VirtualMethodTest { class BaseAnimal { public virtual void Func() // 注意virtual,表明这是一个虚方法 { Console.WriteLine("I am baseAnimal"); } } class Animal: BaseAnimal { public override void Func() // 注意override ,表明重新实现了虚函数 { Console.WriteLine("I am Animal"); } } class Cat : Animal { } class Dog : BaseAnimal { public new void Func() // 注意new ,表明覆盖父类里的同名方法,而不是重新实现 { Console.WriteLine("I am Dog"); } } class program { static void Main() { BaseAnimal a; BaseAnimal b; BaseAnimal c; BaseAnimal d; a = new BaseAnimal(); b = new Animal(); c = new Cat(); d = new Dog(); a.Func(); b.Func(); c.Func(); d.Func(); Dog d1 = new Dog(); d1.Func(); Console.ReadLine(); } } }
4、虚方法与接口的区别
虚方法与抽象方法都能被重写,抽象方法只能存在于抽象类中,虚方法既可以存在于抽象类中,也可以存在非抽象类中。继承虚方法的类可以重写虚方法也可以选择不重写虚方法,但是抽象方法必须要重写,不然编译会报错。抽象方法是虚方法的一种特殊情况,他的特点在于定了一个规则,他的子类必须遵循这一规则。抽象类运用场景一般在于一个方法是流程里面必要的方法,但是这个方法根据具体情况有多重不一样的实现方法,此时就可以用抽象方法。
5、抽象类与接口的区别
抽象方法与接口都是定义了一种规则,继承他们的类都必须遵循这一规则。抽象类也是类,类所有的特性他都有,接口则不然。抽象类里面可以有非抽象成员,但是接口里面只能有抽象成员,所有成员默认是abstract,类实现继承的时候最多只能继承一个类(抽象类、非抽象类)但是可以继承多个接口。