C#的多态性

参考网址:http://www.cnblogs.com/zhangkai2237/archive/2012/12/20/2826734.html

 

多态的定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

在理解多态之前了解几个概念:重载,重写,虚方法,抽象方法以及隐藏方法。

1、重载:在同一个作用域(一般指一个类)两个或多个方法函数名相同,参数列表不同的方法叫做重载,他们有三个特点

  (1)方法名必须相同

 (2)参数列表必须不相同

  (3)返回值类型可以不相同

1
2
3
4
5
6
7
8
9
10
public void Sleep(){
  cw("Animal睡觉"); 
}
public int sleep(){
  cw("Animal几点睡觉");
}
public void Sleep(int time)
{
    cw("Animal{0}点睡觉",time);
} 

2、重写:子类中满足自己的需要来重复定义某个方法的不同实现,需要用override关键字,被重写的方法必须是虚方法,用的是virtual关键字。

  (1)相同的方法名。

  (2)相同的参数列表。

  (3)相同的返回值。

1
2
3
4
5
6
7
8
9
10
父类中的定义:
  public virtual void EatFood()
 {
    cw("Animal吃东西")  ;
 }
  
 子类中的定义
 public override void EatFood(){
    cw("cat吃东西");
}

 tips:虚方法能直接被调用

 

4、抽象方法:在基类中定义的并且在派生类中重写的方法,使用abstract关键字定义。如:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
基类:
public abstract class Biology
{
   public abstract void Live(); 
}
 
子类
public class Animal:Biology
{
   public override void Live()
  {
     cw("Animal重写的抽象方法");
  }
}
 
tips :抽象类中可以包含抽象类,也可以包含已经实现的。
         已经实现的类不能包含抽象类。

 

5、隐藏方法:在派生类中定义的和基类中的某个方法同名的方法,使用new关键字定义。如在基类Animal中有一方法sleep();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  public void Sleep(){
     cw("Animal Sleep");
  }
 
  在派生类cat中定义隐藏方法的代码为:
  new public void Sleep(){
     cw("Cat Sleep");
 }
 
  public new void Sleep()
{
    cw("Cat Sleep"); 
}
 
tips:(1)隐藏方法不但可以隐藏基类中的虚方法,而且可以隐藏基类中的非虚方法
        (2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法
        (3)和上条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果调用的是父类的实例,那么调用基类的方法,如果引用的是派生类的实例,则调用派生类的方法。
 
详细解说:
 class Program
    {
        static void Main(string[] args)
        {
            //Animal 的实例
            Animal a = new Animal();
            a.EatFood();
            //Animal 的实例,引用派生类Cat对象
            Animal ac = new Cat();
            ac.EatFood();
            ac.Sleep();
 
            Cat c = new Cat();
            c.Sleep();
            //Animal的实例,引用派生类Dog对象
            Animal ad = new Dog();
            Console.ReadKey();
 
        }
    }
 
    public abstract class Biology
    {
        public abstract void Live();
    }
 
    public class Animal : Biology
    {
        public override void Live()
        {
            Console.WriteLine("Animal重写的Live");
        }
 
        public void Sleep()
        {
            Console.WriteLine("Animal Sleep");
        }
 
        public int Sleep(int time)
        {
            Console.WriteLine("Animal在{0}点Sleep",time);
            return time;
        }
 
        public virtual void EatFood()
        {
            Console.WriteLine("Animal EatFood");
        }
    }
 
    public class Cat : Animal
    {
        public override void EatFood()
        {
            Console.WriteLine("Cat EatFood");
        }
        new public void Sleep()
        {
            Console.WriteLine("Cat Sleep");
        }
    }
 
    public class Dog : Animal
    {
        public override void EatFood()
        {
            Console.WriteLine("Dog EatFood");
        }
    }
 
父类 animal   子类 cat
当出现 Animal a=new Cat(); 时,调用的是父类的 的方法。
当出现 Cat c=new Cat();时,调用的是子类的隐藏方法。

  

 

posted @   zmztyas  阅读(285)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示