zoukankan      html  css  js  c++  java
  • (原创)c#学习笔记09--定义类01--c#中的类定义

    第九章 定义类

      本章内容:

        ●  如何在C#中定义类和接口

        ●  如何使用控制可访问性和继承的关键字

        ●  System.Object类及其在类定义中的作用

        ●  如何使用VS和VCE提供的一些帮助工具

        ●  如何定义类库

        ●  接口和抽象类的异同

        ●  结构类型的更多内容

        ●  复制对象的一些重要信息

    9.1  C#中的类定义

      C#使用class关键字来定义类:

          class MyClass 
          { 
              // Class members. 
          }

      默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它。可以使用internal访问修饰符关键字显式指定,如下所示(但这是不必要的):

          internal class MyClass 
          { 
              // Class members. 
          }

      另外,还可以指定类是公共的,应该可以由其他项目中的代码来访问。为此,要使用关键字public

          public class MyClass 
          { 
              // Class members. 
          }

      note: 以这种方式声明的类不能是私有或受保护的。可以把这些声明类的修饰符用于声明类成员,详见第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. 
          } 

      表9-1是类定义中可以使用的访问修饰符的组合。

      

      

    接口的定义

      声明接口的方式与声明类的方式相似,但使用的关键字是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的成员可以通过接口类型的变量来访问。如上所述,不能用实例化类的方式来实例化接口。下面的实例提供了一些类定义的代码和使用它们的代码。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    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();
            }
        }
    }

      执行项目,结果如图所示。

      

    示例的说明

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

      

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

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

          MyComplexClass myObj = new MyComplexClass(); 
          Console.WriteLine(myObj.ToString());

      这是继承自 System.Object 的一个方法(图中没有显示,该图省略了这个类的成员,使图变得更清晰),并把对象的类名作为一个字符串返回,该类名用任意相关的命名空间来限定(本例中的命名空间为:Ch09Ex01)。

      

  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4934001.html
Copyright © 2011-2022 走看看