介绍:

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

继承

一个简单的例子:

  1. ClassA:
  2.  
  3. class ClassA:ClassB
  4. {
  5. public void Display1()
  6. {
  7. Console.WriteLine("ClassA Display1");
  8. base.Display1();
  9. }
  10. }
  11.  
  12. ClassB:
  13.  
  14. class ClassB
  15. {
  16. public int x = 100;
  17. public void Display1()
  18. {
  19. Console.WriteLine("ClassB Display1");
  20. }
  21. public void Display2()
  22. {
  23. Console.WriteLine("ClassB Display2");
  24. }
  25. }
  26.  
  27. class Program
  28. {
  29. static void Main(string[] args)
  30. {
  31. ClassA a = new ClassA();
  32. a.Display1();
  33. Console.ReadKey();
  34. }
  35. }
  36.  
  37. /*
  38. 输出结果:
  39. ClassA Display1
  40. ClassB Display1
  41. */

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

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

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

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

  • 静态成员:类内带有static关键字,他属于这个类,可以直接访问
  • 普通成员:通过这个类的实例来访问,他仅仅属于这个类创建的那个实例
  1. public class ClassB
  2. {
  3. }
  4.  
  5. public class ClassA : ClassB
  6. {
  7. }
  8.  
  9. //编译时其实是:
  10.  
  11. public class ClassB:object
  12. {
  13. }
  14.  
  15. public class ClassA : ClassB
  16. {
  17. }

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

再看一个例子:

  1. public class ClassW
  2. {
  3. }
  4.  
  5. public class ClassX
  6. {
  7. }
  8.  
  9. public class ClassY : ClassW, ClassX
  10. {
  11. }

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

再看一个例子:

  1. public class ClassW:ClassY
  2. {
  3. }
  4.  
  5. public class ClassX:ClassW
  6. {
  7. }
  8.  
  9. public class ClassY : ClassX
  10. {
  11. }

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

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

再看一个例子:

  1. public class ClassB
  2. {
  3. public int b = 100;
  4. }
  5.  
  6. public class ClassA:ClassB
  7. {
  8. public int a = 100;
  9. }
  10.  
  11. /// <summary>
  12. /// Program: used to execute the method.
  13. /// Contains Main method.
  14. /// </summary>
  15. public class Program
  16. {
  17. private static void Main(string[] args)
  18. {
  19. ClassB classB = new ClassB();
  20. ClassA classA = new ClassA();
  21. classA = classB;
  22. classB = classA;
  23. }
  24. }

这个例子会出现错误:无法将类型“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 隐式转换为char,但char可以转换为 int。

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

C#面向对象(OOP)入门—第二天—多态和继承(继承)的更多相关文章

  1. C#面向对象(OOP)入门—第一天—多态和继承(方法重载)

    面向对象是什么 面向对象是一种基于对象的编程方法,它取代了仅仅依靠方法和流程的编程方式.面向对象的编程语言中,对象(object)其实就是指特定类型.或某个类的实例.面向对象使得编程人员更容易组织和管 ...

  2. Java入门 第二季第三章 继承

    这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/124 3-1 Java 中的继承  ★ 概念:继承是类与类的一种关系,是一种 "is ...

  3. PHP面向对象(OOP)编程入门教程链接

    PHP官方学习OOP: http://php.net/manual/zh/oop5.intro.php 从其他博主学习:(以下链接来源: http://blog.snsgou.com/post-41. ...

  4. php面向对象(OOP)编程完全教程

    摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...

  5. 【PHP面向对象(OOP)编程入门教程】21.多态的应用

    多态是除封装和继承之外的另一个面象对象的三大特性之一,我个人看来PHP中虽然可以实现多态,但和c++还有Java这些面向对象的语言相比,多 态性并不是那么突出,因为PHP本身就是一种弱类型的语言,不存 ...

  6. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  7. 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...

  8. JAVA入门第二季(mooc-笔记)

    相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第二季&g ...

  9. OO的奇妙冒险——OOP入门与字符串处理

    OO的奇妙冒险 ~OOP入门与字符串处理~ 总体分析 公测 中测(基础与进阶): 其实在我看来,从完成作业的角度来说,中测的基础与进阶并没有任何区别,都不能挂,都不太难,都对得分没有什么影响.中测的样 ...

随机推荐

  1. [APIO2017]商旅 0/1分数规划

    ---题面--- 题解: upd: 在洛谷上被Hack了...思路应该是对的,代码就别看了 感觉有个地方还是非常妙的,就是因为在x买东西,在y卖出,就相当于直接从x走向了y,因为经过中间的城市反正也不 ...

  2. BZOJ4890 & 洛谷3761:[TJOI2017]城市——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4890 https://www.luogu.org/problemnew/show/P3761 从加 ...

  3. Codeforces 854C Planning(贪心+堆)

    贪心:让代价大的尽量移到靠前的位置. 做法:先让前k个数加进堆里,枚举k+1~n+k,每次把新元素加进堆后找到最大代价放在当前位置即可. #include<bits/stdc++.h> # ...

  4. 【图论】Floyd消圈算法

    毫无卵用的百度百科 Definition&Solution 对于一个给定的链表,如何判定它是否存在环以及环的长度问题,可以使用Floyd消圈算法求出. 从某种意义上来讲,带环的链表在本质上是一 ...

  5. JavaScript是没有域的限制

    baidu的通行证处理都是在二级域名passport.baidu.com中处理的,但是baidu很多地方登录都好像是用ajax处理的,他是怎么做的呢?研究了一下,发现一个小技巧. 在http://zh ...

  6. 在Linux中新增与删除用户可以使用命令:Useradd

    在Linux中新增与删除用户可以使用命令:Useradd 我们先使用man命令理解一下Useradd的用法 新增与删除用户操作需要先获取高级用户权限 输入命令:sudo -i 确定后输入高级用户密码 ...

  7. 如何在Linux上安装QQ

    我一直无法解决Ubuntu QQ问题,而最近我重装ubuntu之后在网络上找到与QQ相关的内容,网上有大神开发出了新版的wineQQ,解决了我们对QQ的需求.经过尝试,完成了QQ安装 如图  安装的是 ...

  8. 【题解】Radio stations Codeforces 762E CDQ分治

    虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ ...

  9. lnmp git ruby sass 安装

    1 cd .. 2 ls 3 cd mzx/ 4 ls 5 cd 桌面 6 cd lnmp1.4-full/ //到lnmp 的官网上下载后,根据官网的提示来安装lump 7 ls 8 install ...

  10. iOS 网络请求--- 配置info.plist文件

    一.配置info.plist <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitra ...