温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#forUnity快速入门(连载8)-C#抽象类与接口

发布时间:2020-06-16 22:37:45 来源:网络 阅读:1996 作者:Liu_guozhu 栏目:开发技术

 C# for Unity 编程语言快速入门教程(连载8)---C#OOP编程之抽象类与接口

 

   C#的抽象类与接口,是C#OOP编程中非常重要的概念,对于开发出“高内聚、低耦合”的优秀项目具有重要的作用。

   C#抽象类是用关键字abstract 表示的,它即可以修饰类(抽象类),也可以修饰方法(抽象方法)。抽象类主要的作用是:列举一个类所需要的行为,提供一系列的规定,约束子类行为。


  C#抽象类与抽象方法具备以下重要规则:

  1:抽象类不能被实例化。

  2:抽象类不明确提供具体 方法实现。(但可以包含普通的方法)

  3:定义基类(父类)中的抽象方法,则派生类(子类)必须重载(重写)该方法。
  4:抽象方法一定属于抽象类,但抽象类不一定要包含抽象方法。
  5:抽象方法不能是私有的,而且抽象方法及其重载方法的访问限制应当相同。
  6:抽象方法不能使用virtual 关键字进行修饰。
  7:抽象类不能是密封或静态的  。

  8:抽象类必须由其子类实现它的抽象方法,除非子类也是抽象类。

  9:继承抽象类的派生类,必须使用override 实现抽象方法。

10:抽象方法一定属于抽象类,但抽象类不一定要包含抽象方法。


  我们生活中的接口是: “不同物理设备与软件程序实现沟通与数据传输的规格与标准”(例如:USB接口,即可以应用在鼠标链接上,也可以应用在移动硬盘、USB盘、手机、数码相机、充电宝....)
  C#中的接口就是:“某个事物对外提供的一些功能的申明”,我们使用interface 关键字来声明一个接口,注意这里接口是一个与类“平行”的编程单位,相互之间没有隶属关系。

 

  C#的接口具备以下重要规则:

  1: 接口可以继承,类似类的继承。

  2: 接口可以实现多重继承,类不可以。

  3: 可以把接口理解为更纯的抽象类,因为接口中所有的方法都是抽象的,没有普通方法。

  4: 接口和抽象类不能被实例化。

  5: 接口的任何派生实现类,都必须实现接口的所有方法。

  6: 接口不允许有任何构造函数或字段。

  7: 接口成员总是公共的,不能声明虚拟和静态的。

  8: 接口中不允许指定任何访问修饰符,(隐式为public)不需要访问修饰符。

  9: 类不允许多继承,但接口允许多继承。
      好的编程习惯: 使用接口名作为方法的前缀,这称为“显示接口实现”。
      对于明确指定了接口的方法,就不再允许使用修饰符,一律为 public。


  以上两篇文章我们学习了方法重载,方法重写,抽象类,抽象方法,接口等。现在总结一些概念之间的区别点:

  1:不能同时使用 virtual 和 override 修饰一个方法。
  2:虚拟方法不能是私有的。
  3:对于 interface 、virtual、override、sealed 关键字的理解:
        interface: 引入一个方法的名称
        virtual:   方法的第一个实现。
        override:  方法的另一个实现。
        sealed:    方法的最后一个实现。


   目前关于C#基础编程,截至本篇笔者提供了8篇技术介绍性文章,现在提供从类的访问修饰符到目前接口的一些典型学习习题,供C#初学者学习之用。

编程题目:

1: 学习定义类与访问修饰符。   
1.1>: 已知交通工具类定义如下。
class Vehicle
{
   private int _length;  //长度
   private int _width;   //宽度

   public void Drive(){}; //驾驶方法
}
要求:(1)实现设个类;(2)定义并实现一个小车类car,是它的派生类,小车本身的私有属性有载人数,小车的方法有init(设置车轮数、重量和载人数),get passenger(获取载人数),print(打印车轮数、重量和载人数)。


2: 学习继承
  2.1>: 编写一个学生和教师的数据输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类。

3: 方法重载(静态多态性)
   3.1>:    利用多态性实现多功能计算器:
          A)定义方法名为computeMethod 的方法,实现加法器。
          B)再定义方法名为computeMethod 的方法,实现具备加减乘除综合计算功能。
          C)在main 方法中调用以上方法,且测试。
   3.2>:    利用多态性实现如下功能。
         A)定义一个Father 类,利用构造方法的重载概念定义三个构造方法。
         B)定义Child 类继承Father类,在Child的构造方法中分别调用父类不同的构造方法。

4: 方法重写
   4.1>: 设计一个基类,在其中创建方法MConvert,这个方法接受一个代表公里数的参数,将其转换为对等的英里数之后,然后创建一个继承此类的子类,增加可将输入的公斤数转换为磅的新方法 KConvert, 最后产生子类的实例对象, 测试这两个功能。
   提示信息:
   1千米(公里) = 0.62英里
   1千克(公斤) = 2.2磅


   4.2>: 调整上一题的内容,将其中的MConvert方法声明为virtual, 然后在子类中进行覆写,以其所接受的参数为正方形边长,转换为英里后计算其面积。


   4.3>: 创建一个类,重写ToString() 方法, 当其被引用的时候,能够输出此类对象的说明文字,如下:   “测试用的myObject 类对象”


5: 抽象类、抽象方法
  5.1>: 编写一个程序,求圆、圆内接正方形和圆外切正方形的面积和周长。要求设计抽象基类、抽象方法,使用动态多态性。
      提示信息:
       公式: 勾股定义: 直角三角形中两边长平方的和等于第三边的平方:a*a+b*b=c*c            
       圆的半径使用 r:
       内切正方形的边长=r*r+r*r=x*x
                                x=sqrt(2(r*r))
       内切正方形面积    
                 x*x
      内切正方形周长
                  4x
       外切正方形面积
                (r*2)*(r*2)
       外切正方形周长
                (r*2)*4=8r

       形状:   shape  
       圆:     circle  
       正方形: square、
       面积:   area.
       周长:   length.

  5.2>:下面Shape类是一个表示形状的抽象类,Area ( )为求图形面积的函数。请从Shape类派生梯形类(Trapezoid)、圆形类(Circle),三角形类(Triangle),并给出具体的求面积函数。其中,所有派生类计算面积需要用到的参数由构造函数给出,梯形面积计算需要上底、下底和高,三角形面积需要底和高,圆形面积需要半径。
形状的抽象类声明如下:

abstract class Shape {
  abstract public double Area( );
}


6: 接口、多重接口

   6.1>:A)定义Calculate接口,

       接口文件如下:
       interface Calculate
       {
            void getArea();  //计算圆面积。
            void getZC();    //计算圆周长
       }
        
     B) 定义circularity 类,实现接口Calculate. 且调试后输出结果。

  6.2>:  设计一个类TClass, 继承下面的接口IMeasure, 实现其中的Length() 与 Area()方法,来计算特定长度等边三角形的边长和面积。
     interface IMeasure
     {
       int Length(int s);
       int Area(int s);
     }

  6.3>   承上题,设计一个测试程序,创建TClass 的实例对象,调用其中的方法计算边长为10的三角形面积和周长。

  6.4>:  承上题,设计一个测试程序,创建TClass 的实例对象,将其转型为 IMeasure 类型,调用其中的方法来计算边长为10的三角形面积和周长。

  6.5>:  另外设计一个新的类,同时继承下面的接口 IAMeasure 及上面第2题的IMeasure,除了提供对特定长度等边三角形的边长与面积的计算方法外,还实现了IAMeasure的Area()成员,提供对正方形面积的计算方法。
      interface IAMeasure
      {
          int Area(int s);
      }

  

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI