9.1C#中类的定义
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#中类的定义的更多相关文章
- OC基础--OC中类的定义
OC中类的定义与使用跟C#和java差别相当明显,做个笔记,牢记并加以区别! 一.OC中类的定义:关键字@implementation 和 @end 注意事项: 1.定义好一个类之后,要让这个类继承N ...
- python中类的定义、实例化、封装以及私有变量/方法
1. 定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...
- Python中类的定义与使用
目标: 1.类的定义 2.父类,子类定义,以及子类调用父类 3.类的组合使用 4.内置功能 1.类的定义 代码如下: #!/usr/bin/env python #coding:utf8 class ...
- python中类的定义方法
# coding =utf-8 ## 类的定义 ##-------------------------------------------------- class Employee: empCoun ...
- Java中类的定义
成员变量:对应事物的属性 成员方法:对应事物的行为 类定义的格式 定义类:就是定义类的成员,包括成员变量和成员方法 成员变量:和以前定义变量几乎是一样的.只不过位置发生了改变.在类中,方法外. 成员方 ...
- Python中类的定义
class Student(object): # 有点类似其它高级语言的构造函数 def __init__(self,name,score): self.name = name self.score ...
- Python中类的定义及使用
类是一些有共同特征和行为事务事物的抽象概念的总和. 从中可以看出,方法只能使用实例直接调用(无需传self参数),而使用类调用必须传入实例对象: 属性可以使用实例调用,也可以使用类直接调用,因此可以看 ...
- Typescript 中类的继承
Typescript中类的定义与继承与后端开发语言java/C#等非常像,实现起来非常方便,而且代码便于阅读. 用Typescript写较大项目时是非常有优势的. /** * BaseClass */ ...
- C#学习笔记(七)——定义类
一.C#中类的定义 1.类的定义 class Myclass { } 默认情况下是类是内部的,即外部的项目是不可以访问这个类,相当于加internal来修饰.但实际上是不需要加入的. 如果要指定类是公 ...
随机推荐
- Constructing Roads----poj2421(最小生成树Kruskal)
题目链接: http://poj.org/problem?id=2421 想把n个村庄连接在一起:求最小生成树,不同的是已经有了m条线段链接在一起了,求剩下的: 感觉用Kruskal会简单一点 #in ...
- Mirror--如何在主库上增加文件
由于各种原因,如磁盘不空不足,需要对主库增加数据库文件到其他磁盘上,而镜像服务器上没有对应盘符,很多人会选择删除镜像,重新完备还原来搭建镜像,这种方式耗时耗力. 在做此类操作时,需要对主服务器和镜像服 ...
- SQL Server 登录名、服务器角色、用户名和数据库角色 --- 解释
一.基本解释 登录名:登录服务器的用户账号: 服务器角色:登录名对该服务器具有的权限,角色分多种的,一个角色可以有多个登录名,如操作系统的系统用户可以有多个. SQL服务器角色 sysadmin ...
- java-信息安全(十一)-非对称加密算法ECC以及ECDSA签名
概述 信息安全基本概念: ECC算法(Elliptic curve cryptography,椭圆曲线密码学) 一.ECC加密解密[暂时无意义] 椭圆加密算法(ECC)是一种公钥加密体制,最初由Kob ...
- spring 装配集合
1:创建pojo,属性包含集合,集合元素为基本类型 package com.liyafei.pojo; import java.util.List; import java.util.Map; imp ...
- Javaweb开发请求
1.Ajax jQuery对Ajax支持:$.ajax({ }); ==>常用参数:url:请求地址,type:post|get,data:请求参数,dataType:服务器返回数据类型,su ...
- PAT 1045 Favorite Color Stripe[dp][难]
1045 Favorite Color Stripe (30)(30 分) Eva is trying to make her own color stripe out of a given one. ...
- linux mail 发送邮件附件
在很多场景中我们会使用Shell命令来发送邮件,而且我们还可能在邮件里面添加附件,本文将介绍使用Shell命令发送带附件邮件的几种方式,希望对大家有所帮助. 文章目录 1 使用mail命令 2 使用m ...
- Locust性能测试3-no-web模式和csv报告保存
前言 前面是在web页面操作,需要手动的点start启动,结束的时候也需要手工去点stop,没法自定义运行时间,这就不太方便. locust提供了命令行运行的方法,不启动web页面也能运行,这就是no ...
- c#中WMI 中的日期和时间转为本地时间
取得的值:CreationDate:20170122084915 .713600+480 转: var objQuery = new ObjectQuery("select * from ...