9.1 C#中类的定义

C#使用class关键字来定义类   【默认internal】

class MyClass

{

//Class Members

}

在默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它。可以用internal访问修饰符关键字显示指定,如下所示(但这是不必要的)

internal class MyClass

{

//Class Members
}

另外,还可以指定类是公共的,应可以由其他项目中的代码来访问。为此要使用关键字public

public class MyClass
{
//Class members.
}

注意:以这种方式声明的类不能是私有或受保护的。可以把这些类的修饰符用于声明类成员,详见第10章

除了这两个访问修饰符关键字外,还可以指定类是抽象的(不能实例化,只能继承,可以有抽象成员)或密封的(sealed,不能继承)。

为此可以使用两个互斥的关键字abstract或sealed。

所以抽象类必须用下述方式声明

public abstract class MyClass
{
//Class members,may be abstract
}

其中MyClass是一个公共抽象类,也可以是内部抽象类

密封类的声明如下所示

public sealed class MyClass
{
//Class Members.
}

与抽象类一样,密封类也可以是公共或内部的

还可以在类定义中指定继承。为此,要在类名的后面加上一个冒号,其后是基类名,例如

public class MyClass:MyBase
{
//Class members.
}

注意,在C#的类定义中,只能有一个基类,如果继承了一个抽象类,就必须实现所继承的所有抽象成员(除非派生类也是抽象的)。

编译器不允许派生类的可访问性比其基类更高。也就是说,internal类可以继承于一个public类,但是public类不能继承于一个internal类

因此,下述代码是合法的

public class MyBase
{}
internal class :MyBase
{}

但下述代码不能编译

internal class MyBase{}
public class MyClass:MyBase
{}

如果没有使用基类,则被定义的类就只继承于基类System.Object(别名是object)

毕竟,在继承层次结构中,所有类的根都是object,稍后将详细介绍这个类

除了以这种方式指定基类外,还可以在冒号后面指定支持的接口。如果指定了基类,它必须紧跟在冒号的后面,之后才是指定的接口。如果没有指定基类,则接口就跟在冒号的后面。必须使用逗号分隔基类名(如果有基类)和接口名。

例如,给MyClass添加一个接口,如下所示:

public class MyClass:IMyInterface{}

所有的接口成员都必须在支持该接口的类中实现,但如果不想把使用给定的接口成员,就可以提供一个"空"的执行方式(没有函数代码)。还可以把接口成员实现为抽象类中的抽象成员。

下面的声明是无效的,因为基类MyBase不是继承列表中的第一项

public class MyClass:IMyInterface,MyBase{}

指定基类和接口的正确方式如下

public class MyClass:MyBase,IMyInterface{}

可以指定多个接口,所以下面的代码是有效的

public class MyClass:MyBase,IMyInterface,IMySecondInterface{}

下表是类定义中可以使用的访问修饰符的组合

修饰符 含义
无或internal 类只能在当前项目中访问
public 类可以在任何地方访问
abstract或internal abstract 类只能在当前项目中访问,不能实例化,只能继承
public abstract 类可以在任何地方访问,不能实例化,只能继承
sealed或internal sealed 类只能在当前项目中访问,不能派生,只能实例化
public sealed 类可以在任何地方访问,不能派生,只能实例化

接口的定义

声明接口的方式与声明类的方式相似,但使用的关键字是interface,而不是class,例如

interface IMyInterface{}

访问修饰符关键字public和internal的使用方式是相同的,与类一样,接口也默认定义为internal接口。所以要使接口可以公开访问,必须使用public关键字:

public interface IMyInterface{}

关键字abstract和sealed不能在接口中使用,因为这两个修饰符在接口定义中是没有意义的(它们不包含执行代码,所以不能直接实例化,且必须是可以继承的)

接口的继承也可以用与类继承的类似方式来指定。主要区别是可以使用多个基接口,例如

public interface IMyInterface:IMyBaseInterface,IMyBaseInterface2{}

接口不是类,所以没有继承System.Object。但是为了方便,System.Object的成员可以通过接口类型的变量来访问

如上所述,不能用实例化类的方式来实例化接口。

9.1C#中类的定义的更多相关文章

  1. OC基础--OC中类的定义

    OC中类的定义与使用跟C#和java差别相当明显,做个笔记,牢记并加以区别! 一.OC中类的定义:关键字@implementation 和 @end 注意事项: 1.定义好一个类之后,要让这个类继承N ...

  2. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

  3. Python中类的定义与使用

    目标: 1.类的定义 2.父类,子类定义,以及子类调用父类 3.类的组合使用 4.内置功能 1.类的定义 代码如下: #!/usr/bin/env python #coding:utf8 class ...

  4. python中类的定义方法

    # coding =utf-8 ## 类的定义 ##-------------------------------------------------- class Employee: empCoun ...

  5. Java中类的定义

    成员变量:对应事物的属性 成员方法:对应事物的行为 类定义的格式 定义类:就是定义类的成员,包括成员变量和成员方法 成员变量:和以前定义变量几乎是一样的.只不过位置发生了改变.在类中,方法外. 成员方 ...

  6. Python中类的定义

    class Student(object): # 有点类似其它高级语言的构造函数 def __init__(self,name,score): self.name = name self.score ...

  7. Python中类的定义及使用

    类是一些有共同特征和行为事务事物的抽象概念的总和. 从中可以看出,方法只能使用实例直接调用(无需传self参数),而使用类调用必须传入实例对象: 属性可以使用实例调用,也可以使用类直接调用,因此可以看 ...

  8. Typescript 中类的继承

    Typescript中类的定义与继承与后端开发语言java/C#等非常像,实现起来非常方便,而且代码便于阅读. 用Typescript写较大项目时是非常有优势的. /** * BaseClass */ ...

  9. C#学习笔记(七)——定义类

    一.C#中类的定义 1.类的定义 class Myclass { } 默认情况下是类是内部的,即外部的项目是不可以访问这个类,相当于加internal来修饰.但实际上是不需要加入的. 如果要指定类是公 ...

随机推荐

  1. Python开发【笔记】:获取mp3文件获取信息

    import eyed3 def main(): mp3 = '8200031001_13429822982_1_00163e086216990b11e82403f00d3d9a.mp3' xx = ...

  2. 【pyqt5】QdateTimeEdit(日期时间)

    返回当前日期和时间设置 from PyQt5 import QtCore, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): ...

  3. js-jquery-Validate校验【一】

    一.导入 js 库 <script src="http://static.runoob.com/assets/jquery-validation-1.14.0/lib/jquery.j ...

  4. TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库

    这个库andrdoi也可以用,而且是基于类的使用方式: 它支持类似聊天室的功能,即一个人说话,所有客户端都能收到,当然也支持点点通信.它还支持 RMI 的方式调用远程过程. https://githu ...

  5. 使用Fiddler手机抓包https-----重要

    Fiddler不仅可以对手机进行抓包,还可以抓取别的电脑的请求包,今天就想讲一讲使用Fiddler手机抓包! 使用Fiddler手机抓包有两个条件: 一:手机连的网络或WiFi必须和电脑(使用fidd ...

  6. CUDA从入门到精通 - Augusdi的专栏 - 博客频道 - CSDN.NET

    http://blog.csdn.net/augusdi/article/details/12833235 CUDA从入门到精通 - Augusdi的专栏 - 博客频道 - CSDN.NET CUDA ...

  7. MFC CFile类读写文件详解

    CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作. 一个读写文件的例子: 文件I/O 虽然使用CArchive类内建的序列化 ...

  8. VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)

    上一节中鸡啄米讲了为Ribbon Bar添加控件的方法.本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数. 一.为Ribbon Bar添加更多Ribbo ...

  9. 5select的运用

    四.select的运用 --汇总函数 max()最大值,min()最小值,avg()平均值select max(age),min(age),avg(age) from tablename; --算出表 ...

  10. 解决fiddler不能抓取eclipse发出接口请求的问题

    使用eclipse执行接口时,发现在fiddler里面抓不到这些请求. 网上找了很多资料都是让在Eclipse 中设置:Windows > Preferences > Java > ...