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)。

      

  • 相关阅读:
    98.公共汽车
    100.选菜(动态规划)01背包
    102.愤怒的LJF
    96.老鼠的旅行(动态规划)
    95.(01背包)之小吃
    94.Txx考试
    93.数字三角形W(深搜)
    POJ 3352 Road Construction (边双连通分量)
    POJ 3114 Countries in War(强联通分量+Tarjan)
    POJ 3592 Instantaneous Transference(强联通分量 Tarjan)
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4934001.html
Copyright © 2011-2022 走看看