构造对象

子类可以构造父类对象
不同于C++的写法,如下:

  1. //基类名 对象实例 = new 派生类名;
  2. Fruit myFruit = new Apple();

也可以用父类可以构造子类对象

  1. //派生类名 对象实例 = (派生类名)基类对象名;
  2. Apple myApple = (Apple)myFruit;

例如有:

  1. class baseclass
  2. {
  3. public baseclass() { Console.WriteLine("baseclass"); }
  4. public void test() { Console.WriteLine("basemethod"); }
  5. }
  6. class chirclass:baseclass
  7. {
  8. public chirclass() { Console.WriteLine("chirclass"); }
  9. public void test() { Console.WriteLine("chirmethid"); }
  10. }
  11. static void Main(string[] args)
  12. {
  13. //用子类构造父类对象
  14. baseclass c = new chirclass();
  15. c.test();
  16. Console.WriteLine("-------------------------");
  17. //父类可以构造子类对象,不能这么写
  18. //chirclass c2 = new baseclass();
  19. baseclass c2 = (chirclass)c;
  20. }
  21. }

多个类复杂一点:

  1. using UnityEngine;
  2. using System.Collections;
  3. public class Fruit
  4. {
  5. public Fruit()
  6. {
  7. Debug.Log("1st Fruit Constructor Called");
  8. }
  9. public void Chop()
  10. {
  11. Debug.Log("The fruit has been chopped.");
  12. }
  13. public void SayHello()
  14. {
  15. Debug.Log("Hello, I am a fruit.");
  16. }
  17. }
  1. using UnityEngine;
  2. using System.Collections;
  3. public class Apple : Fruit
  4. {
  5. public Apple()
  6. {
  7. Debug.Log("1st Apple Constructor Called");
  8. }
  9. //Apple 有自己的 Chop() 和 SayHello() 版本。
  10. //运行脚本时,请注意何时调用
  11. //Fruit 版本的这些方法以及何时调用
  12. //Apple 版本的这些方法。
  13. //此示例使用“new”关键字禁止
  14. //来自 Unity 的警告,同时不覆盖
  15. //Apple 类中的方法。
  16. public new void Chop()
  17. {
  18. Debug.Log("The apple has been chopped.");
  19. }
  20. public new void SayHello()
  21. {
  22. Debug.Log("Hello, I am an apple.");
  23. }
  24. }
  1. using UnityEngine;
  2. using System.Collections;
  3. public class FruitSalad : MonoBehaviour
  4. {
  5. void Start ()
  6. {
  7. //请注意,这里的变量“myFruit”的类型是
  8. //Fruit,但是被分配了对 Apple 的引用。这是
  9. //由于多态而起作用的。由于 Apple 是 Fruitd的子类,
  10. //因此这样是可行的。虽然 Apple 引用存储
  11. //在 Fruit 变量中,但只能像 Fruit 一样使用
  12. Fruit myFruit = new Apple();
  13. myFruit.SayHello();
  14. myFruit.Chop();
  15. //这称为向下转换。Fruit 类型的变量“myFruit”
  16. //实际上包含对 Apple 的引用。因此,
  17. //可以安全地将它转换回 Apple 变量。这使得
  18. //它可以像 Apple 一样使用,而在以前只能像 Fruit
  19. //一样使用。
  20. Apple myApple = (Apple)myFruit;
  21. myApple.SayHello();
  22. myApple.Chop();
  23. }
  24. }

动态多态性

C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。
请注意,下面是有关抽象类的一些规则:

  • 您不能创建一个抽象类的实例。
  • 您不能在一个抽象类外部声明一个抽象方法。
  • 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。

    1. using System;
    2. namespace PolymorphismApplication
    3. {
    4. abstract class Shape
    5. {
    6. abstract public int area();
    7. }
    8. class Rectangle: Shape
    9. {
    10. private int length;
    11. private int width;
    12. public Rectangle( int a=0, int b=0)
    13. {
    14. length = a;
    15. width = b;
    16. }
    17. public override int area ()
    18. {
    19. Console.WriteLine("Rectangle 类的面积:");
    20. return (width * length);
    21. }
    22. }
    23. class RectangleTester
    24. {
    25. static void Main(string[] args)
    26. {
    27. Rectangle r = new Rectangle(10, 7);
    28. double a = r.area();
    29. Console.WriteLine("面积: {0}",a);
    30. Console.ReadKey();
    31. }
    32. }
    33. }