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

.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.xdnf.cn/news/11929.html

相关文章:

  • 机器学习基础(四) 决策树
  • Spitfire:Codigger 生态中的高性能、安全、分布式浏览器
  • Java 线程池原理详解
  • Rust 学习笔记:Box<T>
  • 更新 Docker 容器中的某一个文件
  • 根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
  • ffmpeg(三):处理原始数据命令
  • 旅游微信小程序制作指南
  • Webpack常见的插件和模式
  • IOS 打包账号发布上传和IOS Xcode证书配置
  • .Net Framework 4/C# 属性和方法
  • VS代码生成工具ReSharper v2025.1——支持.NET 10和C# 14预览功能
  • 【设计模式-4.9】行为型——命令模式
  • 解决Required request part ‘file‘ is not present
  • StarRocks与Apache Iceberg:构建高效湖仓一体的实时分析平台
  • OPENCV重点结构体Mat的讲解
  • 数据结构 [一] 基本概念
  • 第二章 2.2 数据存储安全风险之数据存储风险分析
  • 0. MySQL在Centos 7环境安装
  • flask功能使用总结和完整示例
  • 分布式互斥算法
  • 【C语言练习】080. 使用C语言实现简单的数据库操作
  • Vue + Element Plus 实战:大文件切片上传 + 断点续传
  • [蓝桥杯]小计算器
  • Git-git跟踪大文件
  • Git的使用技巧
  • hive 3集成Iceberg 1.7中的Java版本问题
  • HarmonyOS NEXT应用开发-Notification Kit(用户通知服务)更多系统能力
  • JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/等待通知机制/锁消除
  • Quipus系统的视频知识库的构建原理及使用