首页 > 编程语言 >C#学习笔记 -- 抽象、密封类、静态类、扩展方法

C#学习笔记 -- 抽象、密封类、静态类、扩展方法

时间:2023-05-22 19:45:12浏览次数:60  
标签:密封 C# 成员 -- int static 抽象类 静态 public

1、抽象成员

指设计被覆写的函数成员, 特征如下

  • 必须是一个函数成员,

    • 字段常量不可用

    • 属性、索引器、事件、方法都可用

  • 必须用abstracet修饰

  • 不能实现, 代码、访问器用分号表示

abstract public void PrintStuff(string s);
​
abstract pulbic int MyProperty
{
    set;
    get;
}
注意:
  1. 抽象成员必须在派生类中用相应成员覆写, 但不能用virtual修饰

  2. 类似于虚成员, 派生类中抽象成员的实现必须指定override修饰符

  3. 抽象成员与虚成员两者对比

  虚成员 抽象成员
关键字 virtual abstract
实现体 有实现 没有实现分号代替
在派生生类中被覆写 可以oveeride覆写 必须override覆写
成员的类型 方法 方法
  属性 属性
  事件 事件
  索引器 索引器

2、抽象类

设计为被继承的类, 只能被用作其他类的基类

  • 不能创建抽象类的实例

  • 抽象类使用abstract修饰声明

  • 可以包含抽象成员或普通成员

  • 抽象类的成员可以是抽象成员与普通带实现的成员的任意组合

  • 抽象类自己可以派生自另一个抽象类

    //抽象类
    abstract class AbClass
    {
        ...
    }
    ​
    //派生自抽象类的抽象类
    abstract class MyAbClass : AbClass
    {
        
    }
  • 任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员, 除非他自己也是抽象类

(1)抽象示例

abstract class MyBase
{
    //数据成员
    public int SideLength = 10;
    const int TriangleSideCount = 3;
​
    //抽象属性
    abstract public int MyInt { set; get; }
    //抽象方法
    abstract public void PrintStuff(string s);
​
    //普通方法
    public int PerimeterLength()
    {
        return TriangleSideCount * SideLength;
    }
}
class MyClass : MyBase
{
    private int _myInt;
    public override int MyInt
    { 
        get => _myInt; 
        set => _myInt = value; 
    }
​
    public override void PrintStuff(string s)
    {
        Console.WriteLine(s);
    }
}

3、密封类

  • 密封类只能被用作独立的类, 不能被用作基类, 不能派生

  • 使用sealed关键字密封

sealed class MyClass
{
    ...
}

4、静态类

  • 静态类中所有成员是static的

  • 用于存放不受实例数据影响的数据和函数

  • 常见用法是常数值类、工具类

  • 可以有一个静态的构造函数, 但不能有实例构造函数

    • 静态构造函数不能使用访问修饰符

    • 静态构造函数被编译器编译的时候执行

  • 密封类, 不能被用作基类, 不能派生

  • 可以使用类名和成员名访问, 像访问其他静态成员一样访问静态类的成员

  • 可以使用using static来访问静态类成员

public static class MyUtils
{
    public static float PI = 3.14F;
    public static bool isOdd(int x)
    {
        return x % 2 == 1;
    }
    public static int Times2(int x)
    {
        return x * 2;
    }
    //静态构造函数**不能使用访问修饰符**
    static MyUtils()
    {
        Console.WriteLine("静态工具类");
    }
}
static void Main(string[] args)
{
    Console.WriteLine($"{ MyUtils.Times2(2) }");// 静态工具类, 4
}

5、扩展方法

当你想扩展一个类, 但是这个类不能修改, 比如在第三方类库中, 只要他不是密封的, 就可以把它作为基类并派生自他的类中额外实现这个方法, 就是扩展方法

使用扩展方法的要求

  • 声明扩展方法的类必须为static

  • 扩展方法本身必须声明为static

  • 扩展方法必须包含this作为他的第一个参数类型, 并且在后面跟着它扩展的类的名称

访问修饰符 static class 扩展类
{
    访问修饰符 static 返回值 方法名(this 被扩展类名称 变量)
    {
        ...
    }
}
例子
//被扩展类
public sealed class MyData
{
    private double D1;
    private double D2;
    private double D3;
​
    public MyData(double d1, double d2, double d3)
    {
        D1 = d1;
        D2 = d2;
        D3 = d3;
    }
​
    public double Sum()
    {
        return D1 + D2 + D3;
    }
}
//扩展类
static class EntendMyData
{
    public static double Average(this MyData md)
    {
        return md.Sum() / 3;
    }
​
}
static void Main(string[] args)
{
    MyData myData = new MyData(3.0, 4.0, 5.0);
    double d = myData.Average();
    Console.WriteLine($"增强方法返回值: {d}");
}

标签:密封,C#,成员,--,int,static,抽象类,静态,public
From: https://www.cnblogs.com/phonk/p/17421537.html

相关文章

  • 关于springboot上传完文件读取时资源目录未更新的情况
    之前在实现教学视频上传功能的时候碰到了一个问题,那就是每上传完一个视频文件,页面找不到对应的路径,必须重新构建项目才能找到相应的文件今天在课堂上向老师咨询,才明白javaweb项目读取资源并不是读取实际的本地资源,而是读取target对应目录下的,每个项目都会生成一个对象的target目......
  • LInux调度器
    本文结构前面4节先展开讲讲linux内核2.6.24版本的调度器实现,其中包括CFS调度器。然后对linux历史上出现过的O(1)和O(n)调度器做一个比较,看看它们的优缺点。优先级和调度策略linux中进程优先级在用户试图和内核视图两个方面有着不同表达。在用户层面,对普通进程优先级的描述通......
  • Markdown基本语法
    Markdown学习标题 标题:#+标题名字几级标题几级对应#,记得空格字体粗体xx斜体x斜体加粗x划线xx引用xxxxxx分割线图片 超链接cctv列表表格            代码xxxx ......
  • AcWing905.区间选点
    题目详情知识点区间贪心为什么叫贪心呢?——短视,每次只是在看眼前的东西,在眼前的决策中选一个最优解。而贪心就是根据这种策略能够走到全局最优解的方法【如果用函数图像来表示就是一个单峰的图】贪心的普遍方案一般来说贪心问题没有思路的时候我们可以先随便试一下,再去举一......
  • python基础08
    字典的内置方法1#dic={'username':"kevin",'age':18}2#定义空字典3#d={}4#info=dict(username='kevin',age=18)5#print(info)67##1.支持key取值8#new_dic=dic['username']9#print(new_dic)10#ite......
  • 测试工程师:这锅我不背,什么情况测试容易背锅以及化解妙招
     当产品出了问题,谁都不想担这个责任时,锅由谁来背呢?在测试的日常工作中,相信经常有测试的小伙伴遇到类似的情况:在项目上线时,只要出现问题(bug),测试就很容易成为“背锅侠”。1)背部门之间未及时沟通的锅之前做过一个项目,在项目验收阶段,客户对下单的流程提出了一些优化性的建议,但是在......
  • 算法基础上机实验——2023.5.21
    2.#include<cmath>#include<cstdio>#include<iostream>#include<algorithm>usingnamespacestd;intmain(){intn; cin>>n; n=n*100; intcock,hen,chicken; intcount=0; for(cock=0;cock<=n;c......
  • 开源协议&版权
      免费自由开源GPL开源协议:个人企业组织等可免费使用、拥有源代码,二次开发衍生模块需开源,且只可开源发布、不能销售。LGPL开源协议:个人企业组织等可免费使用、拥有源代码,二次开发衍生模块无需开源,且还可自主发布、销售。BSD开源协议:个人企业组......
  • pod调度:节点选择与亲和
    0、简介k8s对于pod的调度有如下几种:按node名称、按标签、节点亲和、pod亲和1、使用nodeName指定节点场景:pod需要部署到指定节点。方案:[root@vmrootschedule-yamls]#catschedule-deloyment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:scdl-dspec:selector:......
  • 软硬件易混概念(二)同步vs异步
    1、硬件:同步时钟vs异步时钟同步时钟:同步时钟+当两个时钟间的相位是固定关系的,则可以称这两个时钟为同步时钟(synchronous+clock)。一般同源,如由同一个MMCMorPLL产生的两个时钟可以称为同步时钟。因此可以将主时钟和与之对应的衍生时钟约束成同一个时钟组。异步时钟:无法判定......