目录
一、定义
二、虚方法:
三、抽象类与抽象方法:
四、接口实现:
五、总结:
一、定义
多态:在面向对象语言中,接口的多种不同实现方式即为多态
多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现。在C#中可以通过多种途径实现多态性。
二、虚方法:
将父类的方法标记为虚方法,使用关键字virtual,此方法在子类中可以重写(使用关键字override)
1.当某个实例方法声明包括 override 修饰符时,该方法将重写所继承的具有相同签名的虚方法。
2.子类可以重写父类,可以不重写。
(1)重写:当子类重写的时候,显示的就是重写后的内容;
(2)隐藏:当子类不进行重写的时候,显示的就是原来父类中的内容。
3.重写只能重写父类的虚方法,实方法是不可以重写的。
4.虚方法不能用 static 修饰 。
5.虚方法不能用 private 修饰,因为虚方法就是让子类来重写的,如果声明为 private,子类就无法重写,所以不能是私有的 。
6.实例(代码展示)
static void Main(string[] args)
{
//可以在父类的方法的修饰符后面加 virtual
//在子类中重写父类的方法,加上一个override;调用父类的方法,但是把父类的方法进行重写了
//更换了方法里面的内容
Person p = new Person();
p.Show();
Teacher t = new Teacher();
t.Name = "张三";
t.Age = 90;
t.Gender = '男';
t.Show();
Console.ReadKey();
}
}
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set {_gender = value ;}
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public virtual void Show()//虚方法----
{
Console.WriteLine("我是人别害怕");
}
public void Say()
{
Console.WriteLine("Hello");
}
}
public class Teacher : Person
{
public override void Show()
{
Console.WriteLine("我是老师");
}
三、抽象类与抽象方法:
如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法
写成抽象方法,子类中的方法仍用关键字override重写。
1.抽象方法使用 abstract 修饰符进行声明,并且只有在同样被声明为 abstract 的类中才允许出现。
2.抽象方法必须在每个非抽象派生类中重写。
3.抽象方法没有方法体。
4.抽象类无法实例化。
5.抽象类中的抽象方法是给子类写的,父类自己用不了。
6.父类是抽象类,子类继承了这个类,必须把抽象类中的抽象方法重写。
7.实例:(代码展示)
static void Main(string[] args)
{
//抽象方法是用abstract修饰;
//抽象方法没有方法体
//抽象方法必须在抽象类中
//抽象类无法实例化
//抽象类中的抽象方法是给子类写的,它自己用不了
//父类是抽象类,子类继承了这个类,必须把抽象类中的抽象方法重写
Chinses china = new Chinses ();
china .Speak ();
Console .ReadKey ();
}
}
public abstract class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public abstract void Speak();
}
public class Chinses:Person
{
public override void Speak()
{
Console.WriteLine("汉语");//重写了父类中的抽象方法
}
四、接口实现:
接口使用 interface 关键字声明,它与类的声明类似。接口声明默认是 public 的。通常接口命令以 I 字母开头。
1.接口不能直接实例化。
2.接口可以多实现,但是类只能单继承。
3.类定义可以在不同的源文件之间进行拆分 接口则不可以。
4.接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
5.接口可以实现接口。
6.实例:(代码展示)
static void Main(string[] args)
{
//这里的IFly既不是父类又不是主类,为什么能New出student?
//其实原因就在与Student实现了IFly这个接口
//其实这个也是多态的一种体现形式(非常高级的内容)
//接口不能直接实例化
//接口可以多实现,但是类只能单继承
//类定义可以在不同的源文件之间进行拆分 接口则不可以
//接口、类、结构都可以从多个接口继承
//接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员
//接口可以实现接口
IFly ifly = new Student();
ifly.IFly();
Console.ReadKey();
}
}
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set {_gender = value ;}
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public void Say()
{
Console.WriteLine("Hello");
}
}
public class Teacher:Person,IFly //既有继承又有接口的情况
{
public void Say()
{
Console.WriteLine("我是老师");
}
public void IFly()//实现接口,这里的内容不可以省略,既然用就必须实现,不可以空缺
{
Console.WriteLine("我会飞");
}
void IFly.IFly()//显示实现接口
{
Console.WriteLine("我也会飞");
}
}
public class Student:IFly //接口叫实现不叫继承
{
public void SayHello()
{
Console.WriteLine("我是学生");
}
public void IFly()
{
Console.WriteLine("我会飞");
}
五、总结:
当然就我目前水平认识的多态还远远不够,有很多的知识还隐藏在其后,需要我们不断的总结和实践方能见到其真相。本文中
如有不恰当之处,还望指出。本人不甚感激。