zoukankan      html  css  js  c++  java
  • 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的一个方法(图中没有显示,因为该图省略了这个类的成员),并把对象的类名作为一个字符串返回,该类名用所有相关的名称空间来限定。

    来源于:http://blog.163.com/mairujun@yeah/blog/static/161858177201031514020206/

  • 相关阅读:
    HDU 2955 Robberies(01背包)
    HDU 2602 Bone Collector(01背包)
    HUST 1352 Repetitions of Substrings(字符串)
    HUST 1358 Uiwurerirexb jeqvad(模拟解密)
    HUST 1404 Hamming Distance(字符串)
    HDU 4520 小Q系列故事――最佳裁判(STL)
    HDU 2058 The sum problem(枚举)
    【破解】修改程序版权、添加弹窗
    HDU 1407 测试你是否和LTC水平一样高(枚举)
    HDU 1050 Moving Tables(贪心)
  • 原文地址:https://www.cnblogs.com/lbs8/p/3658929.html
Copyright © 2011-2022 走看看