本文主要讲述 interface 、 virtual 、 abstract、override、new(修饰符) 的使用方法和区别。
interface
interface 只能包含方法、属性、事件和索引,实现接口的类必须实现接口成员。只提供一些方法规约,不提供主体,不能用 public 、 abstract 等修饰。请看实例:
[csharp]
interface IAnimal
{
void Eat();
void Run();
void Play();
}
class Dog:IAnimal
{
public void Eat()
{
// Eat
Console.WriteLine("Your dog is eating");
}
public void Run()
{
// Run
Console.WriteLine("Your dog is running");
}
public void Play()
{
// Play
Console.WriteLine("Your dog is playing");
}
static void Main(string[] args)
{
// 声明一个接口实例
IAnimal animal = new Dog();
// 调用接口成员
animal.Eat();
}
}
一个接口可以从一个或多个基接口继承。再重申下interface 和 abstract 两者之间的区别:
1.interface 不能包含方法实现,abstract class可以包含也可以不包含。
2.interface只能继承interface,abstract class可以继承class或者一个或多个interface
3.interface不能包含字段,可以包含属性,abstract class 都可以包含
4.interface不能包含构造和析构函数, abstract class都可以
5.interface支持多继承,abstract class不支持多继承
abstract
abstract 关键字用来修饰方法、类、属性、索引和事件声明,标记为 abstract 的抽象类的成员必须通过抽象类的派生类来实现。这里之前说过 abstract 就不说了,给个地址 :http://blog.csdn.net/ywy0012011/article/details/8167161。
virtual
virtual 关键字用来修饰方法、属性、索引和事件声明,使它们在子类中可以被重写。
静态属性使用 virtual 是错误的。通过使用 override 属性声明,可以在派生类中重写虚拟继承属性。
override
override 提供从基类继承的成员实现。不能重写非虚方法或静态方法,重写的基类方法必须有 virtual 、 abstract 或 override 修饰的。override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
new (修饰符)
new 关键字可以显示隐藏从基类继承的成员。 一般方法,若在派生类中重写,须使用new关键字。new 和 override 的区别,即重写和隐藏的区别:
new 的用法:
[csharp]
class Circle : Shape
{
// 隐藏字段 'x'
new public static int x = 100;
static void Main()
{
// 显示 x 新的值
Console.WriteLine(x);
// 显示 x 的隐藏值
Console.WriteLine(Shape.x);
// 显示非隐藏的值 y
Console.WriteLine(y);
}
}
/* Output:
100
22
55
*/
override 用法
[csharp]
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int side = 0;
public Square(int n)
{
side = n;
}
public override int Area()
{
return side * side;
}
static void Main()
{ www.zzzyk.com
Square sq = new Square(12);
Console.WriteLine("Area of the square = {0}", sq.Area());
}
}
/* Output:
Area of the square =144
*/
abstract和virtual 的区别:
1: Abstract方法只能在抽象类中声明,虚方法则不是。
Abstract方法必须在派生类中重写,而virtual则不必(可以override也可以不用override)
2: Abstract方法不能声明方法实体,
abstract public void SD();
虚方法则可以
3. abstract,virtual在实现过程中需要用到new 和 override,而interface则不用