• 20151028c#4


    继承(inheritance)

    增加代码的复用性,可维护性,很多信息都是公共的。继承是一个程序内部类的相互交叉。 接口是程序对外提供的交互服务。

    例如:100个类  50个类有公共的东西 把公共的东西提取出来放到父类里

    插座-先做模型-提交给实施方

    抽象类 接口 定义了方法的名称 返回类型 没有具体实施

    直接 让其它的类去继承实现

    架构师做整体规则 写接口

    主要特点:

    1、A:B A叫子类(派生类Derived class),B叫父类(超类、基类Base class),B里面的所有成员(字段、方法)都会被A继承

    B里面的私有成员,A也是继承下来了的,只是没有访问权限。

    2、A:B,B:C===》A:C

        class  Animal
        {
            public int z = 10;
            public Animal()
            {
                Console.WriteLine("我出生了,我是动物");
            }
        }
        class Person:Animal
        {
            public int age;
            public string name;
            public void SayHi()
            {
                Console.WriteLine("大家好,我是人类");
            }  
        }      
        class Chinese:Person
        {
        }
                Chinese c1 = new Chinese();
                c1.age = 10;
                c1.name = "lxx";
                c1.SayHi();
                c1.z = 30;

    3、任何类型的基类是Object

    4、当一个类是密封类(sealed),它是不能被继承的

      sealed class Animal

    5、A:B,B里面有SayHi方法,用A的对象调用SayHi的时候,首先调用的是B里面的构造方法,然后是A的构造方法,最后才是SayHi方法,如果B上面

    还有继承的类,则先调用该类的构造方法。

       class Person
    { //1
    public Person() { Console.WriteLine("我出生了,我是人类"); } }
        class Chinese:Person
        {   //2
           public Chinese()
            {
                Console.WriteLine("我是中国人,我出生了");
            } 
         //3      public void SayHi()
            {
                Console.WriteLine("大家好,我是中国人");
            }

    }
          Chinese c1 = new Chinese();
          c1.SayHi();

    6、A:B,A和B里都有一个方法SayHi,默认情况下,运用A的对象调用SayHi的时候,调用的是子类的SayHi方法,父类的被隐藏了,规范化要在子类加new关键字。

        class Person
        {
         //隐藏
    public void SayHi() { Console.WriteLine("大家好,我是人类"); } }
        class Chinese:Person
        {    
        //1
    public new void SayHi() { Console.WriteLine("大家好,我是中国人"); } }
          Chinese c1 = new Chinese();
          c1.SayHi();

    7、A:B,A和B都有一个方法SayHi,当B里面的SayHi方法是一个虚方法(virtual)的时候,A里面的SayHi才能被重写,通过关键字override覆

        class Person
        {
          //隐藏         
          public virtual void SayHi() { Console.WriteLine("大家好,我是人类"); } }
        class Chinese:Person
        {    
          //1       
         public override void SayHi() { Console.WriteLine("大家好,我是中国人"); } }
          Chinese c1 = new Chinese();
          c1.SayHi();

    8、里氏替换原则:子类对象可以赋值给父类变量,反之不成立。

    A:B,A和B里面都有一个方法SayHi,当B b=new A(),b.SayHi()默认情况下,(没被覆写)就近原则调用的是父类的方法

    如果SayHi被覆写,调用的是子类的方法。

    多态

    同一种方法名不同的表现形式,例如 叫声

    重载 方法名相同,方法里的参数的个数、顺序不同。只跟参数有关

            /// <summary>
            /// 第一种重载方式
            /// </summary>
            public void A()
            {
    
            }
            /// <summary>
            /// 第二种重载方式
            /// </summary>
            /// <param name="a">名字</param>
            /// <param name="i">年龄</param>
            public void A(string a, int i)
            {
    
            }
         public string A(int a)//string A()和void A()是同一种重载
            {
                return "aa";
            }

    覆写:虚方法 virtual override

    父类

            public virtual void SayHi()//加入virtual改为虚方法,子类就可重写
            {
                Console.WriteLine("大家好,我是人类");
            }

    子类

            public override void SayHi()//重写父类的方法
            {
                Console.WriteLine("大家好,我是中国人");
            }

    构造方法是不能重写的.静态方法不能被覆写,但可以被隐藏

    静态类里面只能有静态成员

    静态成员不能带override virtual abstract

    字段

    public int age;字段

    没办法灵活的控制它的读和写

    属性

    可以灵活的控制它的读和写 比如判断获取的ID

            string s = "";
            private int age;
    
            public int Age
            {
                get {
                    try
                    {
                        age = s == null ? 0 : Convert.ToInt32(s);
                    }
                    catch
                    {
                        age = 0;
                    }
                    return age;
                }
                set { age = value; }
            }
            

    抽象类abstract

    定义方法名 返回类型 不具体实现

    一个类里只要有一个方法是抽象的,那这个类就是抽象类,即可有抽象的方法,也可以有非抽象的方法,

    子类继承后,重载实现所有的方法,如果不实现编译报错。

        abstract class Class1
        {
            public abstract void A();
            public abstract void B();
            public void C()
            {
                Console.WriteLine("aa");
            }
        }
        class Class2:Class1
        {
            public override void A()
            {
               
            }
    
            public override void B()
            {
    
            }
        }

    接口

    1、接口是用来实现多继承,一个类只能有一个父类,但可以继承于多个接口

    2、更加严格意义上的抽象类,里面的方法只能为抽象方法

    3、定义接口:interface+类名

    4、接口里面的所有成员都是公共的

    5、一个类继承一个接口,就必须完成该接口中所有方法的实现

    6、接口中不能包含字段、构造函数、静态变量

        interface Interface1
        {
            //默认public static
            void A();
            void B();
        }
        class Class3:Interface1
        {
            public void A()
            {
    
            }
            public void B()
            {
    
            }
        }

    new 关键字的使用情况

    1、实例化一个对象new Person();

    2、隐藏一个父类的方法 new void SayHi();

  • 相关阅读:
    Virt-install用法:
    kvm笔记
    配置centos7解决 docker Failed to get D-Bus connection 报错
    linux系统下的用户文件句柄数限制
    Linux下如何通过命令检查网卡是否插上网线
    data命令详解
    cron job 里面,如何让脚本半分钟运行一次?
    bash编程之循环控制:
    bash编程之case语句,函数
    0129集训授课——面向对象思想(一):封装与抽象
  • 原文地址:https://www.cnblogs.com/16lily521/p/4935904.html
Copyright © 2020-2023  润新知