C#基础篇--静态成员、抽象成员、接口

简介: 1.静态成员:     静态成员(static)、静态类与实例成员、类:   静态成员属于类所有,非静态成员属于类的实例所有。  静态成员不能标记为 Virtual,Abstract,Override,也就是说静态成员不能实现多态。

1.静态成员:  

  静态成员(static)、静态类与实例成员、类:

  静态成员属于类所有,非静态成员属于类的实例所有。
  静态成员不能标记为 Virtual,Abstract,Override,也就是说静态成员不能实现多态。
  静态成员创建后始终使用同一块内存(静态存储区),而使用实例成员的方式会创建多个内存。
  静态类中只能声明静态方法和静态字段,静态方法只能访问静态成员变量。
  由于静态成员是在整个程序退出时,才释放资源,所以尽量避免写静态字段或静态属性,最好只写静态方法。
  当一个普通的类中有静态成员时,系统会默认添加一个静态的构造函数。
  静态的构造函数,只会在第一次使用静态成员之前执行。并只执行一次,不管以后是否多次使用静态成员。
  静态构造函数就是在该类名前加一个Static。
  静态的构造函数不能有访问修饰符、并且也不能带参数。
  静态成员就相当于Abstract和Sealed的结合体。
    静态类不能被继承,静态类不能实现任何接口。 

  什么时候使用静态成员?
    当多个对象共享同一个数据的时候就可以在实例类中加入静态成员。

  什么时候使用静态类?
         1.当这个类是一个工具类,里面都是方法,为了让用户调用的时候方便。(例如:系统中的convert、Math就是静态成员)
         2.模拟“全局变量”的时候。例如:人类,每个人都是一个对象。而所有的人都居住在同一个星球----地球上

2.简单的介绍一下密封成员(Sealed)

  密封类(sealed) ,是不能被继承的,密封方法。
  在一个子类的重写方法前加上sealed关键字,这样这个方法以后就不能再重写了。
  什么时候用密封类?
  1.像String类,在.net系统中本身对字符串有很多特殊处理,为了防止别的类继承后造成混乱。
  2.关于一些商业的问题,不想让别人知道你内部的信息。

 

3.抽象成员

  抽象成员与抽象类:

  1. 抽象方法不能有任何方法体。用Abstract来标记。
  2. 抽象成员必须包含在抽象类中,不能写在一个实例类中。
  3. 父类中的抽象成员,子类继承必须重写,除非子类也是抽象类。
  4. 抽象类是不能被实例化的。
  5. 抽象成员访问修饰符不能是Private.
  6. 抽象类中可以包含实例成员。因此抽象类中有构造函数,虽然不能实例化。
  7. 抽象类就是为了让子类继承。(来实现多态),它定义的就是公共的实现和能力。
  8. 抽象方法不能用Static来修饰。 
  9. 抽象类可以用来实现接口

  抽象方法与虚方法使用时的区别:

  1. 如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
  2. 如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。 

  注意:   

    1.抽象属性虽然与自然属性一样的写法,但不是同一种东东,抽象的属性必须在子类中重写。属性、索引器也是另一种方法的表现形态
    2.如果子类中某一个方法与父类中某一个方法相同,如果不是用Override重写的,那么就要在前面加一个new,表示在子类中写了一个全新的方法,与父类没有关系。

4.接口(Interface)  

         定义:接口就是统一的规范,以I开头命名,以Able作结尾。 

  接口的使用:

  1. 接口中只能包含方法(方法、属性、索引器、事件),并且方法中不能有任何方法实现。因此接口中没有构造函数,并且不能被实例化。
  2. 接口中的成员不能有任何的访问修饰符,默认是Public。
  3. 当一个类同时继承了某个类,并且也实现了一个或多个接口时候,必须把继承的类写在第一个位置。
  4. 实现接口的类,必须实现接口中的所有成员,抽象类也可以实现接口。
  5. 类与接口是实现关系,而不是继承,因为接口就是规范。可以把接口理解成类的父类。
  6. 接口与接口之间也是可以有(继承)的关系的
  7. 在实现接口的时候可以把接口中的方法修改为Virtual或Abstract. 

  建议:在接口中不要写太多的方法。可以把多个方法分别写到各个接口中,要避免接口的污染。(例如:古代的活字印刷术有些相似)。 

  注意:  

        1.在计算机中就算类中已经把接口的那些规范都实现了,但没有继承接口,这样是错的,因为在计算机中必须实现接口,才能保证实现了这些规范。
    2.在扩展原功能要修改原文件,修改原文件就会看到原代码,因此在写程序的时候要注意不要出现这个问题,要把变化的东东封装起来。我们要面向父类、面向接口编程。
    3.能够写实例成员的类中一定就会有构造函数。 

  接口的好处:

  1. 解决了类的多继承的问题。
  2. 解决了类继承以后体积庞大的问题。 

  显示实现接口:

  1. 访问修饰符是Private.(根据反编译得到的)目地就是防止类来调用。
  2. 只有用接口才能调用。
  3. 接口名.方法名();并且没有访问修饰符。
  4. 并且能更好的解决方法重名的问题。

 

 

 

每一天都是崭新的,我们的目标有多远,我们就能走多远,坚持!!
目录
相关文章
|
6月前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
213 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
6月前
|
IDE C# 开发工具
C#系列之接口介绍
C#系列之接口介绍
|
6月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
3月前
|
C#
一文搞懂C#中类成员的可访问性
一文搞懂C#中类成员的可访问性
54 5
|
1月前
|
C#
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。 接口使得实现接口的类或结构在形式上保持一致。 抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。 抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。
49 9
|
2月前
|
存储 C# 开发者
C#一分钟浅谈:静态成员与静态类介绍
在C#编程中,`static`关键字用于创建静态字段、方法、属性和构造函数等,这些成员属于类本身而非实例。本文从基本概念入手,详细探讨了静态成员与静态类的特点、应用场景及常见误区。通过示例代码展示了如何使用静态字段和方法,并讨论了静态类的定义及其在工具箱和常量集合中的应用。最后总结了正确使用这些特性的策略,以帮助开发者编写高效、可维护的代码。
73 11
|
2月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
118 5
|
3月前
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
83 1
|
3月前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
35 0
|
5月前
|
开发框架 .NET 编译器
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
37 2