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

c#笔记之类的继承


一、类的定义

类可以理解为现实世界的某一个东西抽象集成

二、类的构造器和初始化器

2.1构造器

构造器就是在实例化的时候会用()去调用构造器;构造器要求和类的名字相同;在不新建的时候会系统创建一个不可见的默认构造器;(在你创建了一个带参数的构造器的时候系统就不会再默认创建没有参数的默认构造器了需要的话得自己创建;)在默认构造器里会把类的属性和成员赋一个默认值比如字符串就是空;int就是0;

下面是一个例子一个Student类;有了构造器所以实例化的时候要加给一个int值;一个类可以有多个构造器,在初始化的时候就可以不同的重载;

public class Student { public int age = 0; public string _Name public Student(int iage) { this.age = iage; } public Student(string Name) { this._Name= Name; } } ///实例化 Student stu = new Student(12);

2.1 补充this 我一般不用

在类的构造器多的时候顺便可能出现的情况就是this,就是比如一个类有两个构造器一个是初始构造器没有参数还有一个是有参数的构造器,可以用this类调用;少些几行代码;比如下面的例子bmw类有两个构造器一个是接受实例传入一个名字还有一个构造器是实例不传入就默认是“bmw”;就可以使用:this来调用那个有实参的构造器;可以少些一行代码当然也可以直接不用this直接写入默认名字: strBrand = “bmw”:

public class BMW { public string strBrand { get; set; } public BMW():this("BMW") { } public BMW(string _brand) { strBrand = _brand; } }

2.2初始化器

初始化器可以在实例一个类的时候直接给变量或属性赋值就是{}

public class Student { public int age = 0; public string _Name public Student(int iage) { this.age = iage; } public Student(string Name) { this._Name= Name; } } ///实例化 Student stu = new Student(12){age=55,_Name = "小明"};

2.3 析构器

在类被垃圾回收的时候就会执行析构器;~类名

public class Student { public int age = 0; public string _Name public Student(int iage) { this.age = iage; } public Student(string Name) { this._Name= Name; } ~Studenr() { } } ///实例化 Student stu = new Student(12);

三、类的声明

在写一个类的时候是声明一个类;在类的对象或者实例的时候用创建;

3.1声明的位置

有以下两种:1.在命名空间里;2.在类里成为成员类;3.是在命名空间外但是这种其实也是在一个隐式的命名空间globe里而且这种不常用

namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { /* 我的第一个 C# 程序*/ Console.WriteLine("Hello World!"); Console.ReadKey(); } } public class Test { } } /************************************/ 第二种 namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { /* 我的第一个 C# 程序*/ Console.WriteLine("Hello World!"); Console.ReadKey(); } public class Test { } } }

3.2public 和internal修饰以及private

public:所有地方都可以访问;可以在命名空间里直接用

internal:只能在当前项目里访问;(别的项目引用这个项目或者这个项目生成一个dll库,这种时候不能访问的);可以在命名空间里直接用

private:只能在当前类里访问;只能在类里用

4.类的继承

有两种叫法:基类和派生类;父类和子类

4.1为什么有继承

继承(Inheritance)是面向对象编程(OOP)的三大核心特性之一(另外两个是封装和多态),它的设计本质是为了解决代码复用、逻辑抽象和体系化设计的问题。

比如有好几个类都有好几个属性和方法是一样的但是又有不一样的属性和方法;这种时候如果每个类都重复声明相同的属性和方法的话很麻烦就可以把相同的属性和方法包装到一个类里;这个类就是基类;其他的类继承自这个基类也可以使用这些属性和方法

注意如果基类里的属性是静态的(static)那么所有的派生类都是共享同一个状态;也就是改了一个所有的派生类都会生效;这就有一个问题在多线程的情况下操作不同的派生类以下三种情况就要注意原子性(线程安全)要加lock

  1. 访问静态成员:基类中若有static字段 / 属性(属于类级别的共享资源),则所有派生类的实例在多线程中访问时会共享该状态。例如:基类有static int count,多个线程的派生类实例调用修改count的方法,可能导致计数错误。

  2. 访问实例成员但共享实例:若多个线程操作同一个基类(或派生类)实例,且基类方法修改该实例的非静态成员(如this.xxx),则存在线程安全问题。例如:两个线程同时调用同一个Student实例(继承自Person)的基类方法UpdateAge(),可能导致年龄更新异常。

  3. 方法内部使用共享外部资源:基类方法若操作全局变量、文件、数据库连接等外部共享资源,多线程调用时也需考虑原子性。

4.2 补充

  1. sealed关键字修饰的类不能有子类;
  2. 一个类只能有一个基类;
  3. 子类的访问级别不能超过父类;

4.3 继承的特点

4.3.1全盘继承

子类会全盘继承父类的所有东西;下面例子的student继承自human;xiaoming继承自student;xiaoming依旧可以访问human的sex属性

using System; namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { XiaoMing x = new XiaoMing(); x.Sex = "boy"; Console.WriteLine(x.Sex);//结果 输出boy Console.ReadKey(); } } class human { public string Sex{get;set;} } class Student:human { } class XiaoMing:Student { } }

4.3.2构造器

在一个派生类被声明一个对象实例的时候会先调用基类的构造器再调用派生类的构造器;并且构造器是不会被继承的;会先执行基类的构造器再执行子类的;

using System; namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { /* 我的第一个 C# 程序*/ XiaoMing x = new XiaoMing(); // x.Sex = "boy"; Console.WriteLine(x.Sex);//输出为xx Console.ReadKey(); } } class human { public human() { Sex = "xx"; } public string Sex{get;set;} } class Student:human { } class XiaoMing:Student { } }

上面是父类构造器没有参数的情况;下面是父类构造器有参数但是子类没有构造器或者子类构造器没有参数的情况:human是父类构造器有两个参数,student是子类没有构造器或者是构造器不需要参数;

情况1: class human { public human(string x,int y) { Sex = x; } public string Sex{get;set;} } class Student:human { public Student():base("ss",1) { } }

下面是父类构造器有参数子类构造器也有参数的情况,一般是共用一个参数既给父类也给子类;

class human { public human(string x,int y) { Sex = x; } public string Sex{get;set;} } class Student:human { public Student(string xp):base(xp,1) //*(也可以赋值别的给基类的构造器:public Student(string xp):base(“ss”,1))*/ { } }

下面是父类有多个构造器的时候;这种时候就看子类的:base()这里参数是哪个就匹配父类的哪个

class human { public human() { } public human(int y) { } public human(string x,int y) { Sex = x; } public string Sex{get;set;} } class Student:human { public Student(string xp):base(xp,1) { } } 或者是base()调用只有一个int参数的构造器 class Student:human { public Student(string xp):base(1) { } }

4.3.3 protected关键字

只能派生类访问,但是是跨程序集的也就是只要基类是可以跨程序集访问的,那跨程序集的派生类也可以访问


学习时间:

25.11.06


http://www.jsqmd.com/news/477092/

相关文章:

  • 【windows】如何通过防火墙配置实现ICMP协议通信(允许ping)
  • CMOS技术解析:从基础原理到现代应用
  • 如何用boto CloudFormation快速构建AWS基础设施:Python开发者的终极指南
  • Aptos状态同步V2:终极指南与核心技术解析
  • Colyseus 数据库集成终极指南:如何持久化游戏数据和玩家信息
  • DetSql vs 传统手工注入:如何用这款Burp插件提升3倍挖洞效率?
  • 微信小游戏备案全流程避坑指南:从Cocos Creator构建到审核通过
  • OpenInTerminal终极指南:10个高级脚本生成器和自定义命令配置技巧
  • 终极xhyve自动化部署指南:5步实现虚拟机批量管理的高效方案
  • Flutter 三方库 binary_stream 的鸿蒙化适配指南 - 极致的位运算艺术、在鸿蒙端实现高性能二进制流处理实战
  • 从零开始搭建家庭网络安全实验室:ARP欺骗攻防全解析(含Wireshark抓包分析)
  • Airtest连接安卓设备黑屏?试试这个javacap参数配置(附完整代码示例)
  • Flutter 三方库 modddels 的鸿蒙化适配指南 - 业务逻辑的“金刚不坏之身”、在鸿蒙端实现强验证 DDD 模型实战
  • 终极移动端AST Explorer使用指南:随时随地探索语法树的完整教程
  • 从零开始:使用BouncyCastle实现SM4加解密(Java版)
  • Python设计模式终极指南:10个可维护代码的完美实现方法
  • 终极Emmet-vim版本管理指南:5步轻松升级与维护插件版本
  • 终极指南:如何用nlp-recipes构建多语言NER系统,解决非英语命名实体识别挑战
  • 终极指南:如何将wav2letter无缝迁移到Flashlight平台
  • Flight组件通信的7种高效事件处理方式:终极指南
  • Vendure插件开发终极指南:从入门到精通构建自定义电商功能
  • 终极xhyve VNC配置指南:如何在macOS上实现远程虚拟机访问
  • Stanford Alpaca训练资源规划:成本预算与硬件选型指南
  • 终极AnyPixel.js实时数据处理指南:构建动态响应交互系统的核心技术解析
  • DevSecOps安全测试左移终极指南:如何在开发早期发现安全漏洞
  • 突破性能瓶颈:roadmap.sh全链路优化指南(内存与CPU调优实战)
  • 新蜂商城购物车系统终极指南:Pinia状态管理与全局数据同步实现
  • Caldera权限管理终极指南:多用户环境下的安全访问控制
  • AST Explorer 性能优化终极指南:处理大型代码文件的10个技巧
  • HarmonyOS Media Library Kit 媒体文件管理开发指南