• 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所示。          

                                       图  1

    示例的说明

    这个项目在下面的继承层次结构中定义了类和接口,如图2所示。

                                  图  2

    这里包含Program,是因为这个类的定义方式与其他类的定义方式相同,而它不是主要类层次结构中的一部分。这个类处理的Main()方法是应用程序的入口点。

    MyBase和IMyBaseInterface被定义为公共的,所以它们可以在其他项目中使用。其他类和接口都是内部的,只能在这个项目中使用。

    Main()中的代码调用MyComplexClass的一个实例myObj的ToString()方法:

    MyComplexClass myObj = new MyComplexClass();

    Console.WriteLine(myObj.ToString());

    这是继承自System.Object的一个方法(图中没有显示,因为该图省略了这个类的成员),并把对象的类名作为一个字符串返回,该类名用所有相关的名称空间来限定。

  • 相关阅读:
    Ajax XMLHttpRequest对象的三个属性以及open和send方法
    去空格
    绑定事件中 如可控制函数的执行次数
    我之理解---计时器setTimeout 和clearTimeout
    关于border边框重叠颜色设置问题
    YbtOj练习:二分5 飞离地球
    YbtOj练习:二分4 分割矩阵
    YbtOj练习:二分3 攻击法坛
    YbtOj练习:贪心3 最优密码
    YbtOj练习:二分2 最小时间
  • 原文地址:https://www.cnblogs.com/bluesea-flash/p/3420855.html
Copyright © 2020-2023  润新知