什么是多态(Polymorphism)多态核心一句话:**父类引用指向子类对象,调用方法时,执行的是子类重写后的实现。
实现多态两大常见方式:
1. **虚方法 virtual + override(普通基类)** —— 你的 Animal / Dog / Cat 这套
2. **抽象方法 abstract + override(抽象基类)** —— 你的 Person / Man / Woman 这套
两者只是基类形式不一样,**都属于多态**。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp13
{
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Cat cat = new Cat();
Animal animal = dog;
animal.Bark();
animal = cat;
animal.Bark();
Man man = new Man();
Woman woman = new Woman();
man.Bark();
woman.Bark();
Person person = man;
person.Bark();
Console.Read();
}
}
public class Animal
{
public virtual void Bark()
{
Console.WriteLine("Animal Barking....\r\n");
}
}
public class Dog : Animal
{
public override void Bark()
{
Console.WriteLine("Dog Barking.... Wang wang\r\n");
}
}
public class Cat : Animal
{
public override void Bark()
{
Console.WriteLine("Cat Barking.... Miao\r\n");
}
}
public abstract class Person
{
public abstract void Bark();
}
public class Man : Person
{
public override void Bark()
{
Console.WriteLine("I'm a man.\r\n");
}
}
public class Woman : Person
{
public override void Bark()
{
Console.WriteLine("I'm a woman\r\n");
}
}
}
这是面向对像的多态吗?
using System;
namespace ConsoleApp13
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("===== ① virtual + override 【标准多态】 =====");
Animal animal1 = new Dog();
animal1.Bark(); // 执行 Dog 的 Bark(多态)
Console.WriteLine("\n===== ② new 方法隐藏【不是多态!】 =====");
Animal animal2 = new Pig();
animal2.Bark(); // 执行父类 Animal 的 Bark!不会走到Pig方法
Pig pig = new Pig();
pig.Bark(); // 只有用Pig变量调用,才执行Pig自身方法
Console.ReadKey();
}
}
public class Animal
{
public virtual void Bark()
{
Console.WriteLine("Animal Barking....");
}
}
// 方案A:override 重写 → 多态
public class Dog : Animal
{
public override void Bark()
{
Console.WriteLine("Dog:汪汪汪");
}
}
// 方案B:new 隐藏父类方法,不是多态
public class Pig : Animal
{
public new void Bark()
{
Console.WriteLine("Pig:哼哼哼");
}
}
}
写法 是否多态 父类引用指向子类对象调用结果
virtual + override ✅ 是多态 执行子类方法
new 同名方法 ❌ 不是多态 执行父类方法
抽象类abstract + override ✅ 是多态 执行子类方法