• 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的成员可以通过接口类型的变量来访问

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

  • 相关阅读:
    解决Windows2003不能自动分配移动存储设备及硬盘盘符
    Asp.net2.0工具包AjaxControlToolkit下载和安装
    VC++开发MapX
    MapXtreme 中改变feature颜色
    IIS 发布网站流程
    net 2.0下的asp.net ajax基本使用方法
    vs2005下,"回发或回调参数无效"的解决方法
    MapXtreme 2005 地图标注全攻略
    Mapxtreme符号化
    MapXtreme 使用技巧10例
  • 原文地址:https://www.cnblogs.com/chucklu/p/4050167.html
Copyright © 2020-2023  润新知