多态
能让一个对象表现多个类型 形态
实现多态都是: 声名 父类 = new(指向子类)子类
虚函数
虚函数中的父类是可以有方法体{}的,且可以看到父类的标识是"virtual",子类的标识是"override".
- 虚函数的函数及方法
class Animal
{
public virtual void Dosth()
{
Console.WriteLine("动物的嚎叫");
}
}
class Dog : Animal
{
public override void Dosth()
{
Console.WriteLine("狗狗是汪汪叫");
}
}
class Cat : Animal
{
public override void Dosth()
{
Console.WriteLine("猫咪是喵喵叫");
}
}
- 主函数
class Program
{
static void Main(string[] args)
{
Animal n = new Animal();
n.Dosth(); //动物的嚎叫
Dog d = new Dog();
d.Dosth(); //狗狗是汪汪叫
Animal a = new Dog();
a.Dosth(); //狗狗是汪汪叫
//上面的区别从哪导入Dog()这个函数,可以从父类也可以直接通过子类去导入这个函数
Dog dg = new Animal(); //报错
Console.ReadKey();
}
}
抽象类
抽象类的使用场景:
- 父类方法不知道如何去实现;
- 父类没有默认实现且不须要实例化
虚函数中的父类是没有有方法体{}的,且可以看到父类的标识是"abstract",子类的标识是"override".
抽象类父类有的方法,子类一定要有!!!
虚方法父类有的方法,子类可以有。
理解:
虚方法的父类的方法可以声名父类并调用,抽象类的父类方法里没有具体实例,就算声名了也用不了,所以抽象类里只要存在方法,子类就应该调用,不然抽象类中的方法是无意义的
- 抽象类的函数及方法
abstract class Brak
{
public abstract void Dosth(); //抽象类不应该有方法 方法前需要有public
}
class Dog:Brak
{
public override void Dosth()
{
Console.WriteLine("狗狗是汪汪叫");
}
}
class Cat : Dog //注意这里Cat的爹是Dog
{
public override void Dosth()
{
Console.WriteLine("猫咪是喵喵喵的叫");
}
}
- 主函数
static void Main(string[] args)
{
//Brak b = new Brak() //无法创建Brak接口
Brak b1 = new Dog(); //狗狗是汪汪叫
b1.Dosth();
Dog d = new Dog(); //狗狗是汪汪叫
d.Dosth();
Dog d1 = new Cat(); //猫咪是喵喵喵的叫
d1.Dosth();
Brak b2 = new Cat(); //猫咪是喵喵喵的叫
b2.Dosth(); //子类可以用父类(Cat的爹是Dog,Cat的爷爷是Bark)
Console.ReadKey();
}
接口(interface)
接口类似一种能力,创造这个能力后,谁都可以调用这个能力。
- 接口、方法、函数
//接口
public interface ISwimmingable
{
public void Swim();
}
//虚方法父类
class Duck
{
public virtual void Dosth()
{
Console.WriteLine("鸭子是这么叫的");
}
}
//真鸭子(虚方法、接口)
class RealDuck : Duck, ISwimmingable
{
public override void Dosth()
{
Console.WriteLine("真的鸭子嘎嘎叫");
}
public void Swim()
{
Console.WriteLine("真的鸭子靠划水游泳");
}
}
//木头鸭子(虚方法)
class MuDuck : Duck
{
public override void Dosth()
{
Console.WriteLine("木头鸭子吱吱叫");
}
}
///橡皮鸭子(接口)
class XPDuck : ISwimmingable
{
//public override void Dosth()
//{
// Console.WriteLine("橡皮鸭子叽叽叫");
//}
public void Swim()
{
Console.WriteLine("橡皮鸭子靠发动机游泳");
}
}
- 主函数
class Program
{
static void Main(string[] args)
{
//三个鸭子 真鸭子、木头鸭子、橡皮鸭子 叫的方法
//真鸭子可以自己游泳、橡皮鸭子靠发电机游泳、木头鸭子不会游泳
Duck n1 = new Duck(); //鸭子是这么叫的
n1.Dosth();
Duck n2 = new RealDuck(); //真的鸭子嘎嘎叫 (虚方法)
n2.Dosth();
ISwimmingable n3 = new RealDuck(); //真的鸭子靠划水游泳 (接口)
n3.Swim();
Console.ReadKey();
}
}