zoukankan      html  css  js  c++  java
  • 设计模式学习笔记二:面向对象基础三之多态

    多态
        多态是面向对象的第三大特性。多态表示不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。举例说明:
    国粹京剧以前都是子承父业,代代相传的艺术,假设有一对父子,父亲是非常出名的京剧艺术家,儿子也已长大成人,且模仿父亲的戏惟妙惟肖。有一天父亲病了,不能登台演出,而票早就卖出,退票是会严重影响声誉。怎么办呢?由于京剧是化妆后表演,于是最好的办法就是由儿子待父亲上台表演。
        这里面有几点注意:第一,子类以父类的身份出现。儿子代表老子表演,化妆后就是一父亲的身份出现了。第二 ,子类在工作中以自己的方式来实现。儿子模仿的再好,儿子也只能以自己理解的表现方式去模仿父亲的表演。第三,子类以父类的身份出现时,子类特有的属性和方法不可以使用。儿子通过多年的学习,其实早已有了自己的东西。但在此时,代表父亲表演,绝对是不能表现出来的。这就是多态
        虚方法:为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过再改成员的返回类型前加virtual关键词来实现。通常虚拟的是方法。其实除了字段不能是虚拟的外,属性、事件、和索引器都可以是虚拟的。尽管方法可以是虚拟的,但虚方法还是有方法体,可以实际做些事。子类可以选择使用override关键字,将父类实现替换为他自己的实现,这就是方法重写Override,或叫做方法覆写。
        动物基类:

        /// <summary>
        
    ///父类
        
    /// </summary>
        public class Animal
        {
             
    protected string name = "";
             
    protected int shoutNum = 3;
             
    public Animal(string name)
             {
                 
    this.name = name;
             }
             
    public Animal()
             {
                 
    this.name = "无名";
             }
            
    /// <summary>
            
    /// 虚方法
            
    /// </summary>
            
    /// <returns></returns>
            public virtual string Shout()
            {
                
    return "";
            }
        }

    猫子类:

        /// <summary>
        
    /// Cat子类
        
    /// </summary>
        public class Cat:Animal 
        {
            
    public Cat()
                : 
    base()
            { }
            
    public Cat(string name)
                : 
    base(name)
            { }

            
    public override string Shout()
            {
                
    string result = "";
                
    for (int i = 0; i < shoutNum; i++)
                {
                    result 
    = result + "嘧,";
                }
                
    return "我的名字叫" + name + " " + result; 
            }
        }
    狗子类:
        /// <summary>
        
    /// Dog子类
        
    /// </summary>
        public class Dog : Animal
        {
            
    public Dog()
                : 
    base()
            { }
            
    public Dog(string name)
                : 
    base(name)
            { }

            
    public override string Shout()
            {
                
    string result = "";
                
    for (int i = 0; i < shoutNum; i++)
                {
                    result 
    = result + "汪,";
                }
                
    return "我的名字叫" + name + " " + result;
            }
        }

    动物叫声大赛:
        public class Match
        {
            
    private Animal[] arrAnimal;

            
    private string  ShoutMatch()
            {
                
    string Result = "";
                arrAnimal 
    = new Animal[2];
                arrAnimal[
    0= new Cat("小花");
                arrAnimal[
    1= new Dog("阿毛");

                
    foreach (Animal item in arrAnimal)
                {
                    Result 
    = Result + item.Shout()+";";
                }
                
    return Result;
            }
        }

        Animal相当于京剧的父亲,Cat和Dog相当于儿子,儿子代表父亲表演Shout,但是Cat叫出来的嘧,Dog叫出来的汪。这就是不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。
        注意:对象的声明必须是父类,而不是子类,实例化的对象是子类。
        多态的原理是当方法被调用时,无论对象是否被转化为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用。
  • 相关阅读:
    mac系统xcode升级等软件更换appid账户
    touch id 开发
    iOS自动化编译
    cocopods 知识集合 及 一个 好的 国外iOS技术翻译站
    cocoapods 更新失败 bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
    iOS流量监控
    火星信息安全研究院
    Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。
    Linux各目录及每个目录的详细介绍
    Linux du命令
  • 原文地址:https://www.cnblogs.com/peida/p/1211333.html
Copyright © 2011-2022 走看看