zoukankan      html  css  js  c++  java
  • C#面向对象(OOP)入门—第二天—多态和继承(继承)

    介绍:

    第一天的内容主要是不同情形下的方法重载。这一部分则主要讲面向对象中继承的概念。首先用一个要点图形来定义继承。

     继承

    一个简单的例子:

    ClassA:
    
      class ClassA:ClassB
        {
            public void Display1()
            {
                Console.WriteLine("ClassA Display1");
                base.Display1();
            }
        }
    
    ClassB:
    
    class ClassB
        {
            public int x = 100;
            public void Display1()
            {
                Console.WriteLine("ClassB Display1");
            }
            public void Display2()
            {
                Console.WriteLine("ClassB Display2");
            }
        }
    
    class Program
        {
            static void Main(string[] args)
            {
                ClassA a = new ClassA();
                a.Display1();
                Console.ReadKey();
            }
        }
    
    /*
    输出结果:
    ClassA Display1 
    ClassB Display1
    */
    

     在如上的例子中,ClassB是父类,ClassA是子类,ClassA继承自ClassB(或ClassB派生出ClassA)。

    这个例子也会得到一个警告:“ClassA.Display1()”隐藏继承的成员“ClassB.Display1()”。如果是有意隐藏,请使用关键字 new。  意思是说ClassA中的成员和ClassB中的成员一样,这样基类的就被隐藏了。如果故意为之,可以用"public new void Display1()"来代替。

    知识点:我们可以在子类中定义和基类名称相同的成员,并且子类中的方法总是优先执行然后才是基类(遇到同名的情况时)。当然也可以用base关键字,在子类中调用基类中的成员。另外,继承不能向后兼容(意思就是说基类的实例无法调用派生类的成员,这很好理解)。除了构造函数和析构函数,我们可以从基类继承任何成员。

    对于类的成员,有两种类型:

    • 静态成员:类内带有static关键字,他属于这个类,可以直接访问
    • 普通成员:通过这个类的实例来访问,他仅仅属于这个类创建的那个实例
    public class ClassB
     {
     }
    
     public class ClassA : ClassB
     {
     }
    
    //编译时其实是:
    
    public class ClassB:object
    {
    }
    
    public class ClassA : ClassB
    {
    }
    

    在C#中,如果一个类没有继承任何类,那么它也会默认继承自object类,它是所有类的共同的基类。另外一些特殊的类如:System.ValueType、System.Delegate等无法继承。

    再看一个例子:

    public class ClassW
      {
      }
    
      public class ClassX
      {
      }
    
      public class ClassY : ClassW, ClassX
      {
      }
    

     这样定义ClasssY时,会报错。知识点:在C#,一个类只能继承自一个类,不支持多继承。(其实C#的多继承可以通过接口来完成)

    再看一个例子:

    public class ClassW:ClassY
     {
     }
    
     public class ClassX:ClassW
     {
     }
    
     public class ClassY :  ClassX
     {
     }
    

     这样也会报错:涉及“ClassY”和“ClassW”的循环基类依赖项....(3个错误)

    知识点:C#中不允许循环相依(Circular dependency)。也就是互相继承

    再看一个例子:

    public class ClassB
     {
         public int b = 100;
     }
    
     public class ClassA:ClassB
     {
         public int a = 100;
     }
    
     /// <summary>
     /// Program: used to execute the method.
     /// Contains Main method.
     /// </summary>
     public class Program
     {
         private static void Main(string[] args)
         {
             ClassB classB = new ClassB();
             ClassA classA = new ClassA();
             classA = classB;
             classB = classA;
         }
     }
    

     这个例子会出现错误:无法将类型“ConsoleApplication3.ClassB”隐式转换为“ConsoleApplication3.ClassA”。存在一个显式转换(是否缺少强制转换?)   

    知识点:我们可以把一个派生类对象赋值给基类,但反过来不行。既(基类对象=派生类对象,可以;派生类对象=基类对象,不行)

    总结:本文主要讲了继承的基本概念。

    1. 我们可以在派生类中声明已经在基类中声明的同名函数。
    2. 派生类对象调用方法时,基类总是优先执行。
    3. 保留的关键字“base”可以派生用于调用基类方法
    4. 继承向后兼容。
    5. 除了构造函数析构函数,一个类可以基类继承一切
    6. C# 继承自定义不能派生特殊 C# 之类命令 System.Enum System.Delegate System.Array
    7. 父类只可以有一个C# 支持多重继承通过
    8. C# 中的继承允许循环依赖项
    9. 我们可以将派生类对象赋值给基类,相反
    10. 我们不能int 隐式转换charchar可以转换 int。

    注明:原文地址:https://codeteddy.com/2014/05/16/diving-in-oop-part-2-polymorphism-and-inheritance-inheritance/我只是在作者基础上进行了翻译和总结,并加了一点自己的理解。希望对大家有帮助。如有错误敬请指正。

  • 相关阅读:
    io学习
    asp.net文件上传进度条研究
    asp.net页面中的Console.WriteLine结果如何查看
    谨慎跟随初始目的不被关联问题带偏
    android 按钮特效 波纹 Android button effects ripple
    安卓工作室 日志设置
    安卓工作室 文件浏览器 android studio File browser
    一个新的Android Studio 2.3.3可以在稳定的频道中使用。A new Android Studio 2.3.3 is available in the stable channel.
    新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial
    码云,git使用 教程-便签
  • 原文地址:https://www.cnblogs.com/visionfeng/p/6592134.html
Copyright © 2011-2022 走看看