前言:
前面总结了继承,接下来大概了解下多态,多态是可以表现多个类型的能力—一个事物可以做多种不同的事情,表现为"一个接口,多个功能";
What?:
多态正如字面意思,多种形态,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法,允许将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作;
重载:
重载是在同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同,就是签名不同,签名由方法名和参数组成。能通过传递不同参数来决定到底调用哪一个同名方法;
- 方法同名,但参数列表不同
- 返回值类型不同步可以构成重载–签名不包括返回值
- 同名方法返回值的类型要相同,否则不能重载
- 方法的异常类型和数目不会影响重载
static void Main(string[] args)
{
Printdata p = new Printdata();
p.print(6); // 调用 print 来打印整数
p.print(3.414); // 调用 print 来打印浮点数
p.print("Hello 小仙女,你好哦"); // 调用 print 来打印字符串
Console.ReadKey();
}
重写:
基类方法中使用virtual关键字声明方法和派生类中使用override关键字声明方法名称相同,参数列表也相同,重写也就是相当于重新声明,会覆盖原来的方法和参数;
- 方法同名,且参数列表相同;
- 基类方法和派生类方法的签名相同,实现了派生类重写基类中的同名方法
- 不能使用static修饰
- 完善子类的方法名与父类的方法名重名出现一条绿线
public class Person
{
public override string ToString()
{
return "小仙女可爱的都冒泡了";
}
}
隐藏:
基类中的方法不声明virtual,在派生类中声明与基类同名时,需要使用new关键字,以隐藏基类同名方法
class Program
{
static void Main(string[] args)
{
Teacher t = new Teacher();
t.Show();
}
}
public new void Shout()
{
Console.WriteLine("Dog Shout");
}
抽象方法抽象类:
- public abstract void Show(); 抽象方法
- 抽象方法没有方法体 只有—public abstract void Show();
- 抽象方法必须在抽象类中;
- 抽象类无法实例化;
- 父类是抽象类,子类继承了这个类,必须把这个抽象类中的抽象方法重写;
public abstract class Animal
public class Pig :Animal
{
public override void Shout() //抽象方法
{
Console.WriteLine("哼哼叫");
}
}
接口:
- 是一种规范;接口不能直接实例化 ,不包含方法的实现,接口可以多继承,类只能单继承;
- 接口,类,结构都可以从多个接口继承,
public class Student:IFly //单继承
{
public void SayHello()
{
Console.WriteLine("我是学生");
}
public void IFly()
{
Console.WriteLine("我会飞");
}
}
public class Teacher : Person,IFly //多接口继承
{
public void Say()
{
Console.WriteLine("hellow,我是老师");
}
public void IFly()
{
Console.WriteLine("我会飞");
}
}
静态与非静态比较:
虚方法与抽象方法比较: