C#类的定义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#类的定义
C#使⽤class关键字来定义类:
class MyClass
{
// Class members.
}
这段代码定义了⼀个类MyClass。
定义了⼀个类后,就可以在项⽬中能访问该定义的其他地⽅对该类进⾏实例化。
在默认情况下,类声明为内部的,即只有当前项⽬中的代码才能访问它。
可以⽤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#的类定义中,只能有⼀个基类,如果继承了⼀个抽象类,就必须实现所继承的所有抽象成员(除⾮派⽣类也是抽象的)。
编译器不允许派⽣类的可访问性⽐其基类更⾼。
也就是说,内部类可以继承于⼀个公共类,但公共类不能继承于⼀个内部类。
因此,下述代码是合法的:
public class MyBase
{
// Class members.
}
internal class MyClass : MyBase
{
// Class members.
}
但下述代码不能编译:
internal class MyBase
{
// Class members.
}
public class MyClass : MyBase
{
// Class members.
}
如果没有使⽤基类,则被定义的类就只继承于基类System.Object(它在C#中的别名是object)。
毕竟,在继承层次结构中,所有类的根都是System.Object,稍后将详细介绍这个基类。
除了以这种⽅式指定基类外,还可以在冒号的后⾯指定⽀持的接⼝。
如果指定了基类,它必须紧跟在冒号的后⾯,之后才是指定的接⼝。
如果没有指定基类,则接⼝就跟在冒号的后⾯。
必须使⽤逗号分隔基类名(如果有基类)和接⼝名。
例如,给MyClass添加⼀个接⼝,如下所⽰:
public class MyClass : IMyInterface
{
// Class members.
}
所有的接⼝成员都必须在⽀持该接⼝的类中实现,但如果不想使⽤给定的接⼝成员,就可以提供⼀个"空"的执⾏⽅式(没有函数代码)。
还可以把接⼝成员实现为抽象类中的抽象成员。
下⾯的声明是⽆效的,因为基类MyBase不是继承列表中的第⼀项:
public class MyClass : IMyInterface, MyBase
{
// Class members.
}
指定基类和接⼝的正确⽅式如下:
public class MyClass : MyBase, IMyInterface
{
// Class members.
}
可以指定多个接⼝,所以下⾯的代码是有效的:
public class MyClass : MyBase, IMyInterface,
IMySecondInterface
{
// Class members.
}32
表1是类定义中可以使⽤的访问修饰符的组合。
表 1
修饰符含义
⽆或internal类只能在当前项⽬中访问
public类可以在任何地⽅访问
abstract 或internal abstract类只能在当前项⽬中访问,不能实例化,只能继承
public abstract类可以在任何地⽅访问,不能实例化,只能继承
sealed或internal sealed类只能在当前项⽬中访问,不能派⽣,只能实例化
public sealed类可以在任何地⽅访问,不能派⽣,只能实例化
接⼝的定义
声明接⼝的⽅式与声明类的⽅式相似,但使⽤的关键字是interface,⽽不是class,例如:
interface IMyInterface
{
// Interface members.
}
访问修饰符关键字public 和 internal的使⽤⽅式是相同的,与类⼀样,接⼝也默认定义为内部接⼝。
所以要使接⼝可以公开访问,必须使⽤public关键字:
public interface IMyInterface
{
// Interface members.
}
关键字abstract 和 sealed不能在接⼝中使⽤,因为这两个修饰符在接⼝定义中是没有意义的(它们不包含执⾏代码,所以不能直接实例化,且必须是可以继承的)。
接⼝的继承也可以⽤与类继承的类似⽅式来指定。
主要的区别是可以使⽤多个基接⼝,例如:
public interface IMyInterface : IMyBaseInterface,
IMyBaseInterface2
{
// Interface members.
}
接⼝不是类,所以没有继承System.Object。
但是为了⽅便,System.Object的成员可以通过接⼝类型的变量来访问。
如上所述,不能⽤实例化类的⽅式来实例化接⼝。
下⾯的⽰例提供了⼀些类定义的代码和使⽤它们的代码。
试试看:定义类
(1) 创建⼀个新的控制台应⽤程序Ch09Ex01。
(2) 修改Program.cs中的代码,如下所⽰:
namespace Ch09Ex01
{
public abstract class MyBase
{
}
internal class MyClass : MyBase
{
}
public interface IMyBaseInterface
{
}
internal interface IMyBaseInterface2
{
}
internal interface IMyInterface : IMyBaseInterface,
IMyBaseInterface2
{
}
internal sealed class MyComplexClass :
MyClass, IMyInterface
{
}
class Program
{
static void Main(string[] args)
{
MyComplexClass myObj = new
MyComplexClass();
Console.WriteLine(myObj.ToString ());
Console.ReadKey();
}
}
}
(3) 执⾏项⽬,结果如图1所⽰。
图略
⽰例的说明
这个项⽬在下⾯的继承层次结构中定义了类和接⼝,如图2所⽰。
图略
这⾥包含Program,是因为这个类的定义⽅式与其他类的定义⽅式相同,⽽它不是主要类层次结构中的⼀部分。
这个类处理的Main()⽅法是应⽤程序的⼊⼝点。
MyBase和IMyBaseInterface被定义为公共的,所以它们可以在其他项⽬中使⽤。
其他类和接⼝都是内部的,只能在这个项⽬中使⽤。
Main()中的代码调⽤MyComplexClass的⼀个实例myObj的ToString()⽅法:
MyComplexClass myObj = new
MyComplexClass();
Console.WriteLine(myObj.ToString());
这是继承⾃System.Object的⼀个⽅法(图中没有显⽰,因为该图省略了这个类的成员),并把对象的类名作为⼀个字符串返回,该类名⽤所有相关的名称空间来限定。
来源于:。