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,类实现继承的时候最多只能继承一个类(抽象类、非抽象类)但是可以继承多个接口。