C#中类的继承

1.值类型和引用类型

  • 值类型:int、double、bool、char、decimal、struct、enum
  • 引用类型:string、自定义类、数组
  • 值类型全部存储在栈中,
  • 引用类型的值存储在堆中,引用地址则存储在栈中;
  • 在传递时,传递的方式不一样;

2.字符串

  • 字符串的不可变性(堆中重新开辟一份空间);
  • 字符串可以看做是char类型的一个只读数组 string.ToCharArray() 

3.StringBuilder

  • 创建计时器:StopWatch Elapsed方法,记录总的时间;
  • 没有在内存中开空间,之后在调用ToString()方法,将其转换为string类型
  • 提供了Append方法,能够在已有对象的原地进行字符串的修改,简单直接

4.字符串的方法:

  • Length()
  • ToUpper/ToLower()
  • Equals()
  • Split(new char[]{'-'},StringSplitOptions.RemoveEmptyEntries)
  • bool Contains()
  • Replace()
  • Substring(index,count)截取字符串
  • bool StartWith/EndWith()
  • int IndexOf()/LastIndexOf(),没有则返回-1
  • Trim()/TrimStart()/TrimEnd()
  • IsNullOrEmpty()
  • Join() 用指定的连接符连接字符数组

 5.File

  • ReadAllLine(path,Encoding Default)

 

6.类的继承

  • 我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类;
  • 子类(派生类)--父类(基类)
  • 子类继承了父类的属性和方法,但没有继承父类的私有字段,若为(protected)则可以使用;
  • 子类并没有继承父类的构造函数,依赖于父类的无参是构造函数;
  • 创建子类对象时,会首先执行父类的无参的构造函数,然后在执行子类自己的构造函数,执行构造函数,则说明创造了父类的
  • 子类的内部创建了一个父类的对象,从而使用父类中的成员,如果重新写一个有参数的父类构造函数,那这个无参的构造函数就没有了;
    • 在父类中重新写一个无参数的构造函数
    • 在子类中显示的调用父类有参数的构造函数,使用关键字 :base()
  • 继承的两个特性:
    • 单根型:一个子类只能有一个父类
    • 传递性:多级传递
  • Object类:是一切类的基类
  • new关键字:
    • 创建一个新的对象
    • 隐藏父类继承过来的重名方法或重名成员

转载于:https://www.cnblogs.com/shuichangdong/p/8228456.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
<think>我们注意到用户的问题是关于C#继承语法,特别是如何实现似于"extends"的关键字。在C#中,继承使用冒号(:)语法,而不是像Java那样使用"extends"关键字。根据引用[1]和引用[3]:-引用[1]提到:在Java中,继承使用关键字"extends",而在C#中,接口实现使用冒号(:)。实际上,C#继承也使用冒号(:)。-引用[3]给出了一个明确的C#继承示例:`classRectangle:Shape,PaintCost`,这里`Rectangle`继承了`Shape`,并实现了`PaintCost`接口。因此,C#继承的基本语法是:```csharpclassChildClass:ParentClass{//子的成员定义}```如果同时继承和实现接口,则先写基,再写接口(多个接口用逗号分隔):```csharpclassChildClass:ParentClass,IInterface1,IInterface2{//子的成员定义}```注意:C#不支持多重继承(即只能继承一个基),但可以实现多个接口(如引用[3]所示)。下面我们给出一个完整的示例:```csharpusingSystem;//基publicclassShape{protectedintwidth;protectedintheight;publicvoidSetWidth(intw){width=w;}publicvoidSetHeight(inth){height=h;}}//子继承ShapepublicclassRectangle:Shape{publicintGetArea(){returnwidth*height;}}classProgram{staticvoidMain(string[]args){Rectanglerect=newRectangle();rect.SetWidth(5);rect.SetHeight(7);Console.WriteLine("总面积:{0}",rect.GetArea());}}```在这个例子中:-`Rectangle`通过冒号(:)继承了`Shape`。-`Rectangle`可以访问`Shape`中定义的`width`和`height`字段(因为它们是protected修饰的)。如果还需要实现接口,则可以这样写(如引用[3]所示):```csharppublicclassRectangle:Shape,IMyInterface{//实现接口的方法publicvoidMyMethod(){//方法实现}}```总结:-C#中使用冒号(:)来实现继承,而不是Java中的"extends"关键字。-语法:`classChildClass:ParentClass`-若同时继承和实现接口:`classChildClass:ParentClass,IInterface1,IInterface2`[^1]:引用[1]展示了Java和C#继承和接口实现上的语法差异。[^3]:引用[3]提供了C#继承和接口实现的示例代码。§§相关问题§§1.C#中如何实现多重继承?2.C#中接口和抽象有什么区别?3.在C#中,子如何重写父的方法?4.C#中基构造函数如何调用?</think>### C# 继承语法详解 在 C# 中,继承使用冒号 `:` 语法实现(不同于 Java 的 `extends` 关键字)。以下是具体实现方式和语法规范: #### 1. **基本继承语法** ```csharp // 基(父) public class Vehicle { public int Wheels { get; set; } public void StartEngine() => Console.WriteLine("引擎启动"); } // 派生(子)使用 : 继承 public class Car : Vehicle // 冒号替代Java的extends { public string Model { get; set; } public void Accelerate() => Console.WriteLine("加速中..."); } ``` **说明**: - 冒号 `:` 是 C#继承操作符(相当于 Java 的 `extends`) - 子自动获得父的公共成员(如 `Wheels` 属性和 `StartEngine()` 方法) - 子可扩展新成员(如 `Model` 和 `Accelerate()`)[^1] #### 2. **构造函数处理** ```csharp public class Vehicle { public int Wheels { get; } public Vehicle(int wheels) => Wheels = wheels; } public class Car : Vehicle { public string Model { get; } // 子构造函数通过 base 调用父构造函数 public Car(string model, int wheels) : base(wheels) { Model = model; } } ``` **关键点**: - 使用 `: base(参数)` 调用父构造函数 - 必须匹配父构造函数的参数列表 - 调用顺序:先执行父构造,再执行子构造 #### 3. **方法重写(多态)** ```csharp public class Vehicle { public virtual void DisplayInfo() // virtual 允许重写 => Console.WriteLine("交通工具"); } public class Car : Vehicle { public override void DisplayInfo() // override 实现重写 => Console.WriteLine("这是一辆汽车"); } ``` **规则**: 1. 父方法用 `virtual` 标记 2. 子方法用 `override` 重写 3. 通过基引用调用时执行子实现(多态性) #### 4. **多重继承替代方案** C# **不支持多继承**,但可通过接口实现似功能: ```csharp public interface IAutoPilot // 接口定义 { void EnableAutopilot(); } public class Tesla : Car, IAutoPilot // 继承+实现接口 { public void EnableAutopilot() => Console.WriteLine("自动驾驶已启用"); } ``` - 接口实现使用逗号分隔 `: BaseClass, IInterface1, IInterface2` - 这是 C# 实现多重行为的标准方式[^3] #### 5. **泛型继承** ```csharp public class Repository<T> // 泛型基 { public T Data { get; set; } } public class UserRepository : Repository<User> // 指定具体类型 { public void ValidateUser() => Console.WriteLine("用户验证通过"); } ``` - 继承泛型时需指定具体类型参数(如 `User`)[^2] ### 关键区别总结 | 特性 | C# 语法 | Java 语法 | |--------------|-----------------------|-----------------------| | 继承 | `Child : Parent` | `extends` | | 接口实现 | `: IInterface` | `implements` | | 构造函数链 | `: base(params)` | `super(params)` | | 方法重写 | `virtual`/`override` | `@Override` | > **最佳实践建议**: > 1. 优先使用组合而非深度继承 > 2. 密封不需要被继承(`sealed class`) > 3. 抽象公共行为到接口中 > 4. 避免超过 3 层的继承层级 [^1]: C# 使用冒号实现继承和接口实现 [^2]: 继承泛型需明确指定类型参数 [^3]: 通过接口实现多重继承特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值