zoukankan      html  css  js  c++  java
  • 黑马程序员_面向对象深入2

    ------- android培训java培训、期待与您交流! ----------

    1.抽象类

    抽象类是一个类的抽象化描述,和普通类的定义成员的方法一样,只是如果要定义抽象成员的话,则需要使用到abstract关键字。通常在程序的设计中,把主体的类功能放在抽象类中,让其它类去继承。抽象类不能被实例化,除了使用多态性。所以它的天性就是被别人所继承;

    定义示例:

    abstract class Animal{

                private string name;

                private string color;

                private int age;

                //属性

              public string Name{

                       set{

                                             }

                       get{

                            return name;

                        }

               }

               public int Age{

                        set{

                                if(age>0){

                                      age = value;

                                }

                       get{

                              return age;

                            }

               }

               public string Color{

                        get{

                               return color;

                        }

                         set{

                               color = value;

                        }

               }

               //抽象方法;叫声Yell

               public abstract void Yell(){

                         Console.WriteLline(“我是动物,我会叫

    ”);

               }

    }

    //当然这个类,描述的并不完整,只是为了表达抽象类

    定义一个Dog类,继承这个抽象类

    class Dog:Animal{

            //如果Dog类没有覆盖(和复写一个意思)Animal中的抽象成员

            //那么它也就变成抽象类了

            public override void Yell(){

                      Console.WriteLine(“我是小狗,汪汪的叫”);

            }

    /*这里需要注意一点,那就是子类中覆盖基类的方法,权限修饰符必须大于等于基类中的权限修饰符。这样的话,它的权限就只能是protected,和public了,因为其他两个权限,根本就继承不到*/

    }

     

    2.密封类

    密封类是相对于抽象类来说的,它通常描述放的事物都是非常的具体,这也就导致了,它的一个特性,那就是它不能被继承,它就是它,也只能是它,当然是可以实例化的;

    普通的类中,也可以有密封的方法,但是密封的方法,在它的派生类中是覆盖不了的,也不允许这样的操作;

    定义方法:

    sealed class Apple{

               //密封类主体,除了密封的特性外,其它和普通类无区别

    }

     

    3.接口

    接口在定义的时候,虽然用的不是class关键字,而是interface。但是在实际的概念理解和操作中,我们都可以把它看作是一种特殊的抽象类,它里面的成员必须都是公共抽象的。而且函数不允许有函数体,它之所以这样做。其实是在定义一种标准。

    举例说明,就比如说你的农业银行的银行卡,是可以到任意银行的ATM机上取款的(只是需要手续费),这是为什么呢?因为现在我们的银行卡都是银联所统一规范好的一种介质,而支持这种规范的ATM机,不管你使用什么样的银行卡,只要它符合银联制定的标准,那么我们就可以取到钱;

    类比于接口,也是这样的,它定义了一个标准。任何实现了,该标准的类,我们都可以通过该标准来访问到它们(多态性的又一体现);

    interface Run{

            public abstract void Run();

    }

    interface Jump{

            void Jump();

    }

    //接口在定义的时候其实里面的public和abstract可以省略,因为它们是默认的,不用写也是这样。

    另外接口之间支持多继承,这样也就弥补了,类之间,不能多继承的缺陷;

    interface Sport:Run,Jump{

             //此时Sport中便具有了,另外两个接口中的所有成员;

    }

    在C#中是单继承,多实现的。当一个类即继承了类,又实现了多个接口的时候。只有一个规定,继承的类放在前面写,接口放在后面写,主要是为了区分;

    class Dog:Animal,Run,Jump{

             //复写抽象类中的抽象方法

    }

     

    4.覆盖和隐藏方法

    子类从基类中继承之后,不仅可以选择使用override来覆盖掉,基类中的虚方法(抽象方法也属于虚方法),还可以使用new关键字来隐藏基类的虚方法,隐藏和覆盖的区别在于。如果父类的变量指向子类的实例的话,在覆盖掉父类的方法的话,如果不使用向上转型的话,这个变量,就永远也访问不到自己中的方法;

    而隐藏就不一样了,如果父类引用指向子类的实例,它始终的指向基类中的原方法,我们所隐藏的方法,只属于派生类中,等于是新建了;

    说明代码:

    namespace 隐藏演示
    {
        class Program : Animal
        {
            static void Main(string[] args)
            {
                Animal a = new Program();
                a.Show();
                a.Play();
                Console.ReadKey();
            }
            
            new public void Show() {
                Console.WriteLine("隐藏方法");
            }
            public override void Play()
            {
                Console.WriteLine("覆盖方法");
            }
        }

    //动物类
        class Animal {
            public virtual void Show() {
                Console.WriteLine("show");
            }
            public virtual void Play() {
                Console.WriteLine("play");
            }
        }
    }

    如上程序,运行的结果是show和覆盖方法,因为覆盖掉了基类中的方法,基类的变量就只能使用我们派生类中的方法,隐藏则是基类中的方法;

    5.this和base关键字

    this和base的作用差不多,它们的区别只要记住一点,this代表的是当前的对象,而base是基类的对象;

    我总结了this的功能点主要有三个:1.可以在重载的构造函数中互相调用;

                                                      2.调用本类中的成员;

                                                      3.可以被当作当前对象的参数进行传递;

    而base的作用,则可以对比着this的功能点看,只要将本类换成基类就可以了;

  • 相关阅读:
    css3--简单的加载动画
    background--详解(背景图片根据屏幕的自适应)
    css--两行显示省略号兼容火狐浏览器
    tortoisegit--无法commit
    vim--学习
    JavaScript--数据结构与算法之图
    JSONP
    数据结构--只用位运算实现加减乘除操作
    剑指offer——不用加减乘除做加法
    shop--10.前端展示系统--首页展示(后台)
  • 原文地址:https://www.cnblogs.com/yaochao/p/3983265.html
Copyright © 2011-2022 走看看