C#学习笔记22: 面向对象编程入门精讲(下)

简介: C#学习笔记22: 面向对象编程入门精讲

1.9 抽象类与接口

抽象类可以定义非抽象成员,这些成员被其派生类继承;抽象类的不能被实例化

非抽象类不能定义抽象成员

接口与抽象类的区别:【参考之前博文类与对象学习小结】


接口是一种类型,不提供任何实现的代码,没有构造函数,接口定义的方法是不带任何访问关键字的

抽象类的是类的一种,可以定义非抽象成员和构造函数,成员具有访问属性

不允许一个类同时提供对多个基类 的实现;但允许一个接口同时实现多个接口

实现接口时,必须对接口提供对接口所有成员的实现

接口的显式实现


在实际的开发过程中,如果多个接口定义命名的成员,而这些接口又同时被同一个类实现,此时为了避免成员之间的冲突,需提供对接口的显式实现,在方法调用时,只能通过定义接口进行调用;通过实现类对象无法进行调用,除非将其强制转化为对应的接口。

1.10 拓展方法

在不继承的前提下,对现有类型进行拓展;拓展方法定义在静态类中的静态方法

//拓展方法的定义   
     public static class stringExt//静态类,静态成员
    {
        //将字符串转化为空格分开的字符串
        public static string SplitSpace(this string str)
        {
            return string.Join(" ", str.ToCharArray());
        }
        //将数值转化为其绝对值
        public static int abs(this int num)
        {
            return num >= 0 ? num : 0 - num;
        }
    }

调用拓展方法

            string str = "Ray";          
            Console.WriteLine(str.SplitSpace()); //并不会对str的值产生任何影响,只是产生了一个新的空格分割字符串
            int num = -10;
            Console.WriteLine(num.abs().ToString());

1.11 委托与事件

类似于C语言中的函数指针,C#也可以将函数当作方法传给其他方法

定义委托与定义其他方法类似,不过需要使用关键字delagate关键字

委托类型的隐含公共基类:System.Delagate和System.MulticastDelegate(多播委托);多播委托被调用,会调用与之关联的所有方法;

当将委托当作参数传递某个方法时,是值类型的传递;在方法内部对引用的委托实例进行变更时,并不会反应到原来的委托实例中

可以总结出委托使用的三个关键点:定义委托,委托实例化,委托调用

事件是委托类型,要声明事件就需要定义事件封装类型的委托;然后在类中使用event关键字,同时为了让派生类可以重写该事件,常将其定义为protected类型。习惯上,事件的命名方式为On<事件名>


以学生听到铃声就知道是下课为例,说明事件与委托的关系:铃声响,代表事件发生;学生知道下课就是对事件的响应


标准事件与委托

20190713192807465.png

20190713192821435.png

更为详细的分析见博文委托与事件

1.12 枚举类型

使用枚举类型的好处:

避免意外的调用,调用者只能在给定的值当中做出选择;

可读性强,调用可以方便的识别各枚举值代表的含义

枚举类型继承自Enum类,该类是ValueType类型的派生类,可知枚举类型属于值类型

enum week
{
     mondey,friday,sonday
}

枚举类型的基础类型为int,默认从0开始,后值在前值基础上+1

20190713194823784.png

20190713194842340.png

var myWeek = Enum.GetValues(typeof(week));//获取枚举类型中的所有值到一个对应类型的数组中
string name = Enum.GetName(typeof(week), 2);//sonday
string names = Enum.GetNames(typeof(week));//所有项

1.13 数组

声明与赋值

//先声明后赋值
type[] arr = new type[count];
arr[0] = value1;
arr[1] = value2;
//声明同时赋值
type[] arr = new type[] {valueList};
type[] arr = {valueType};
//二维数组
type[,] arr = new type[rowCount, colCount];
arr[0,0] = value00;
arr[0,1] = value01;

数组遍历

for(int i = 0; i < arr.Count; i++)
{
    Console.Writeline(arr[i].ToString());
}
//所有数组继承自IEnumerable,可以使用foreach遍历
foreach(type var in arr)
{
    Console.Writeline(var.ToString());
}

image.png

20190713202243179.png

上述第二组方法需要用到Predicate委托,原型如下:

20190713202710242.png

T为参数类型,obj为数组中待查找元素应满足条件的方法名

private static bool findProc(T obj)
{
    if(条件一)    
    {
        //处理代码1
        return ture;
    }
    if(条件二)
    {
        //处理代码2
        return false;
    }
}
相关文章
|
2月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
81 7
|
2月前
|
C#
C#入门
C#入门
28 0
|
1月前
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
|
2月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
70 8
|
3月前
|
安全 C#
C# 面向对象编程的三大支柱:封装、继承与多态
【9月更文挑战第17天】在C#中,面向对象编程的三大支柱——封装、继承与多态,对于编写安全、可维护、可复用的代码至关重要。封装通过访问修饰符和属性保护数据;继承允许子类继承父类的属性和方法,实现代码复用和多态;多态则提高了代码的灵活性和通用性。掌握这三大概念能显著提升C#编程能力,优化开发效率和代码质量。
|
2月前
|
C#
C#中的数组型参数学习笔记
C#中的数组型参数学习笔记
31 0
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
3月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
88 0
|
3月前
|
开发框架 .NET Java
C#/.NET/.NET Core自学入门指南
C#/.NET/.NET Core自学入门指南
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
108 0