当前位置: 首页 > news >正文

.Net Framework 4/C# 面向对象编程进阶

一、继承

(一)使用继承

        子类可以继承父类原有的属性和方法,也可以增加原来父类不具备的属性和方法,或者直接重写父类中的某些方法。

        C# 中使用“:”来表示两个类的继承。子类不能访问父类的私有成员,但是可以访问其公有成员,即只要使用 public 声明类成员,就既可以让一个类成员被父类和子类同时访问,也可以被外部的代码访问。

        另外,为了解决父类成员的访问问题,C# 还提供了另外一种访问修饰符:protected,它表示受保护成员,只有父类和子类才能访问 protected 成员,外部代码不能访问。

        子类不能继承父类中定义的 private 成员。

        需要注意以下几点:

  1. C# 只支持类的单继承,而不支持类的多重继承,即在 C# 中一次只允许继承一个类,不能同时继承多个类;
  2. 在实现类的继承时,子类的可访问行必须要低于或者等于父类的可访问性,例如父类采用默认的访问权限:private 时,子类在继承的时候,不能采用 public 的访问权限,因为 public 的访问权限高于 private 的访问权限。

(二) base 关键字

        如果子类重写了父类的方法,并且想在子类的方法中调用父类原有的方法,C# 提供了 base 关键字。

        base 关键字的使用方法与 this 关键字的使用方法类似,this 关键字代表本类对象,base 关键字代表父类对象,使用方法如下:

base.property;		//调用父类的属性
base.method();		//调用父类的方法

        如果要在子类中使用 base 关键字调用父类的属性或者方法,则父类的属性和方法的可访问性必须定义为 public 或者 protecte,而不能是 private。

        另外,使用 base 关键字还可以指定创建子类对象时应调用的父类构造函数。例如有:

public Computer(string name, string num)
{name = name;num = num;
}public Pad(string model, string name, string num):base(name, num)
{model = model;
}

        在静态方法中使用 base 关键字是错误的。

(三)继承中的构造函数与析构函数

        在进行类的继承时,子类的构造函数会隐式地调用父类的无参构造函数,而且先调用父类的构造函数,再调用子类的构造函数,析构函数的调用与构造函数相反。

        需要注意的是,如果父类提供了有参构造函数,在被子类继承时,需要提供无参默认构造函数,这是因为当父类提供有参构造函数时,不会自动提供无参构造函数。

        通过 base 关键字,还可以在子类中调用父类的有参构造函数,此时,父类中就可以不用提供无参构造函数,例如有:

public class Father
{public Father(string name, int age){this.name = name;this.age = age;}
}public class Son : Father
{public Son(string name, int age, char gender) : base(name, age){this.gender = gender;}
}

(四)object 类

        在 C# 中,所有的类都直接或间接的继承自了 object 类,object 类是所有类的基类。

(五)关键字 new 隐藏父类成员

        当子类和父类在声明成员时,如果子类和父类的成员名相同,则会隐藏掉父类的成员方法,子类对象无法调用父类的成员,这时,程序会报警告。因此,可以在子类定义同名成员时,在访问修饰符后面加上 new 关键字,此时就可以完全隐藏掉父类的同名成员。

(六)sealed 修饰符

        继承类时,需要使用冒号加类名,当对一个类应用 sealed 修饰符时(也就是密封类),该修饰符会阻止其他类从该类继承。

(七)里氏转换*

        里氏转换主要有两个作用:

  1. 子类可以赋值给父类,也就是说,如果有一个地方需要一个父类作为参数,我们可以给一个子类代替;
  2. 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。

        例如有:

public class Father
{public void text01(){}
}public class Son : Father
{public void text02(){
http://www.lqws.cn/news/131131.html

相关文章:

  • 从上下文学习和微调看语言模型的泛化:一项对照研究 -附录
  • AI基础知识(LLM、prompt、rag、embedding、rerank、mcp、agent、多模态)
  • 【ArcGIS微课1000例】0148:Geographic Imager6.2使用教程
  • OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()
  • Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结
  • python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
  • x86 汇编逻辑运算全解析:从【位操作】到实际应用(AND,OR,NOT,XOR,TEST)
  • 基于Gemini 2.5 Pro打造的AI智能体CanvasX上线,绘制常见图表(折线图、柱状图等),国内直接使用
  • 如何从零开始建设一个网站?
  • 【计算机网络】HTTPS
  • 网络各类型(BMA,NBMA,P2P)
  • 信息学奥赛一本通 1569:【 例 1】石子合并 | 洛谷 P1880 [NOI1995] 石子合并
  • 【网络安全】漏洞分析:阿帕奇漏洞学习
  • Java观察者模式深度解析:构建松耦合事件驱动系统的艺术
  • OffSec 基础实践课程助力美国海岸警卫队学院网络团队革新训练
  • ArcGIS计算多个栅格数据的平均栅格
  • 行为型-模板模式
  • 将word文件转为kindle可识别的azw3文件的方法
  • 【Qt开发】文件
  • React---扩展补充
  • Flink进阶之路:解锁大数据处理新境界
  • React组件基础
  • 探索分布式存储与通信:去中心化共享及通訊(DSAC)
  • NER实践总结,记录一下自己实践遇到的各种问题。
  • 【python深度学习】Day 44 预训练模型
  • STM32学习之看门狗(理论篇)
  • OA工程自动化办公系统 – 免费Java源码
  • HTTP(超文本传输协议)详解
  • Linux命令:shell脚本文件名全局替换
  • 好坏质检二分类MLP 实战