接上章:

 class NameList
{
public NameList() => Console.WriteLine("这个是NameList的构造函数"); public NameList(string Name) => Console.WriteLine($"这个是NameList的重载构造函数,输入的参数是{Name}"); ~NameList() => Debug.WriteLine("释放NameList"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}");
} class A : NameList
{ public A() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public A(string Name) : base(Name) =>Console.WriteLine($"这个是A的重载构造函数,输入的参数是{Name}"); ~A() => Debug.WriteLine("释放A");
}
class B : NameList
{ public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public B(string Name) => Console.WriteLine($"这个是B的重载构造函数,输入的参数是{Name}"); ~B() => Debug.WriteLine("释放B"); }

这一章 我们来说说 继承的方法和方法隐藏。

我们来修改代码:

这个代码比较尬,主要是演示子类中的方法使用父类的方法。

A类的ShowType方法使用NameList的Show<T>(T type)方法。

class NameList
{
public NameList() => Console.WriteLine("这个是NameList的构造函数"); public NameList(string Name) => Console.WriteLine($"这个是NameList的重载构造函数,输入的参数是{Name}"); ~NameList() => Debug.WriteLine("释放NameList"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); public void Show<T>(T type) where T : NameList => Console.WriteLine(type.GetType().FullName);//泛型方法
} class A : NameList
{ public A() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public A(string Name) : base(Name) =>Console.WriteLine($"这个是A的重载构造函数,输入的参数是{Name}"); ~A() => Debug.WriteLine("释放A"); public void ShowType() => base.Show<A>(this);
}
class B : NameList
{ public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public B(string Name) => Console.WriteLine($"这个是B的重载构造函数,输入的参数是{Name}"); ~B() => Debug.WriteLine("释放B"); }

实例化代码:

   new A().ShowType();

结果

上述代码主要是说子类调用父类的方法,使用Base关键字。当然父类的方法必须是公共的方法。

上面的代码还是比较尬的,赶紧进入下一个环节 继承的隐藏方法

我们先修改代码:

在A类中添加一个名为ID的方法。此时A类有自己的ID方法和继承NameList的ID方法。

 class NameList
{
public NameList() => Console.WriteLine("这个是NameList的构造函数"); public NameList(string Name) => Console.WriteLine($"这个是NameList的重载构造函数,输入的参数是{Name}"); ~NameList() => Debug.WriteLine("释放NameList"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); public void Show<T>(T type) where T : NameList => Console.WriteLine(type.GetType().FullName);
} class A : NameList
{ public A() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public A(string Name) : base(Name) =>Console.WriteLine($"这个是A的重载构造函数,输入的参数是{Name}"); ~A() => Debug.WriteLine("释放A"); public void ShowType() => base.Show<A>(this); public void ID() => Console.WriteLine("这个ID方法是A类");
}
class B : NameList
{ public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public B(string Name) => Console.WriteLine($"这个是B的重载构造函数,输入的参数是{Name}"); ~B() => Debug.WriteLine("释放B"); }

实例化:

new A().ID();

结果

结果是使用的A类专属的ID方法,不再使用继承的ID方法。

但是看代码

会提示报错,为什么?

因为子类的方法和父类的方法是相同。有可能会报错,因为子类继承了父类的方法,子类还拥有的相同的方法。此时不知道到底该运行那个方法。所以这个时候要做出抉择。

这个抉择基本就是规定了。

使用new关键字来隐藏基类成员或者方法。

那么问题来了,我要用父类的方法时候,该怎么办?

嗯,可将子类转父类。

      ((new A()) as NameList).ID();

            /*分割线*/
var a = new A();
(a as NameList).ID();

上述两种方法都是将子类转换父类来使用父类的方法。

值得一说 new关键字是隐藏基类成员,换句话说我在子类中使用和父类一样的方法名和参数时,使用new时,其中的方法内可以实现和父类不一样的代码。

最终的代码:

class NameList
{
public NameList() => Console.WriteLine("这个是NameList的构造函数"); public NameList(string Name) => Console.WriteLine($"这个是NameList的重载构造函数,输入的参数是{Name}"); ~NameList() => Debug.WriteLine("释放NameList"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); public void Show<T>(T type) where T : NameList => Console.WriteLine(type.GetType().FullName);
} class A : NameList
{ public A() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public A(string Name) : base(Name) =>Console.WriteLine($"这个是A的重载构造函数,输入的参数是{Name}"); ~A() => Debug.WriteLine("释放A"); public void ShowType() => base.Show<A>(this); public new void ID() => Console.WriteLine("这个ID方法是A类");
}
class B : NameList
{ public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public B(string Name) => Console.WriteLine($"这个是B的重载构造函数,输入的参数是{Name}"); ~B() => Debug.WriteLine("释放B"); }

继承的基本使用就是这样子了

C# 继承(4)的更多相关文章

  1. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  2. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

  3. javascript中的继承与深度拷贝

    前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...

  4. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. JS继承类相关试题

    题目一: //有关于原型继承的代码如下:function Person(name) {   this.name = name;}Person.prototype = {     getName : f ...

  6. JS继承之寄生类继承

    原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...

  7. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  8. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

  9. 深入浅出JavaScript之原型链&继承

    Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...

  10. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

随机推荐

  1. php数组指定字段排序

    数据全都存放在名为 data 的数组中.这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc(). <?php$data[] = array('volume' => ...

  2. MVC 公共类App_Code不识别

    .Net MVC需要写公共类的时候 右击添加 App_Code 文件夹,新建类—>右击类—>属性,生成操作 —>选择 —>编译 .net MVC项目本身是个应用程序,所以其实不 ...

  3. js中的Array

    js中的Array 啥是ArrayLike对象 类似,下面这种对象的就是ArrayLike var arraylike = { 0: "a", 1: "b", ...

  4. Aptana Studio 3 如何汉化,实现简体中文版

    这篇文章写了又一年多的时间了,哈哈,今天更新一次 此处修正的下面教程的[第五步]Babel Language Pack Update Site for Helioshttp://download.ec ...

  5. JAVA的FileOutput/InputStream使用实例

    在JAVA中,要读写文件,要使用Stream这个东西. Stream简单来说,可以看做在程序和文件之间打开了一个管道,然后把数据通过这个管道输送到文件或程序中去. FileOutput/InputSt ...

  6. EasyUI应用总结

    1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncod ...

  7. Coins and Queries(codeforce 1003D)

    Polycarp has nn coins, the value of the i-th coin is aiai . It is guaranteed that all the values are ...

  8. 动画系统II

    [动画系统II] 1.动画混合(animation blending)是把某个时间点的两个或更多的输入姿势结合,产生骨骼的输出姿势.例如,通过混合负伤的及无负伤的步行动画,我们可以生成二者之间不同负伤 ...

  9. 认识WebRoot和WebContent目录

    1.webRoot是不需要加的,因为它是默认的JSP目录,完整的路径应该是:项目名/xxx.jsp,如果在webroot下边建立了文件夹abc,又在abc中建立了xxx.jsp那么此时的路径应为htt ...

  10. WebFlux04 SpringBootWebFlux集成MongoDB之Windows版本、WebFlux实现CRUD、WebFlux实现JPA、参数校验

    1 下载并安装MongoDB 1.1 MongoDB官网 1.2 下载 solutions -> download center 1.3 安装 双击进入安装即可 1.3.1 安装时常见bug01 ...