上一节:
下一节:

  C# 继承

  • 继承

    面向对象编程中最重要的概念之一是继承。继承使我们可以用另一个类来定义一个类,这使创建和维护应用程序变得更加容易。这也提供了重用代码功能并加快实现时间的机会。创建类时,程序员可以指定新类继承现有类的成员,而不必编写全新的数据成员和成员函数。此现有类称为基类,而新类称为派生类。继承的思想实现了IS-A关系。例如,哺乳动物IS A是动物,狗IS-A是哺乳动物,因此也是狗IS-A动物,依此类推。
  • 基类和派生类

    一个类可以从一个以上的类或接口派生,这意味着它可以从多个基类或接口继承数据和函数。C# 中用于创建派生类的语法如下-
    
    <acess-specifier> class <base_class> {
       ...
    }
    
    class <derived_class> : <base_class> {
       ...
    }
    
    考虑一个基类Shape及其派生类Rectangle-
    
    using System;
    
    namespace InheritanceApplication {
       class Shape {
          public void setWidth(int w) {
             width = w;
          }
          public void setHeight(int h) {
             height = h;
          }
          protected int width;
          protected int height;
       }
    
       // Derived class
       class Rectangle: Shape {
          public int getArea() { 
             return (width * height); 
          }
       }
       class RectangleTester {
          static void Main(string[] args) {
             Rectangle Rect = new Rectangle();
    
             Rect.setWidth(5);
             Rect.setHeight(7);
    
             // Print the area of the object.
             Console.WriteLine("Total area: {0}",  Rect.getArea());
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Total area: 35
    
  • 初始化基类

    派生类继承基类的成员变量和成员方法。因此,应在创建子类之前创建超类对象。您可以在成员初始化列表中提供有关超类初始化的说明。
    以下程序演示了这一点-
    
    using System;
    
    namespace RectangleApplication {
       class Rectangle {
          
          //member variables
          protected double length;
          protected double width;
          
          public Rectangle(double l, double w) {
             length = l;
             width = w;
          }
          public double GetArea() {
             return length * width;
          }
          public void Display() {
             Console.WriteLine("Length: {0}", length);
             Console.WriteLine("Width: {0}", width);
             Console.WriteLine("Area: {0}", GetArea());
          }
       }//end class Rectangle  
       class Tabletop : Rectangle {
          private double cost;
          public Tabletop(double l, double w) : base(l, w) { }
          
          public double GetCost() {
             double cost;
             cost = GetArea() * 70;
             return cost;
          }
          public void Display() {
             base.Display();
             Console.WriteLine("Cost: {0}", GetCost());
          }
       }
       class ExecuteRectangle {
          static void Main(string[] args) {
             Tabletop t = new Tabletop(4.5, 7.5);
             t.Display();
             Console.ReadLine();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Length: 4.5
    Width: 7.5
    Area: 33.75
    Cost: 2362.
    
  • C# 中的多重继

    C# 不支持多重继承。但是,您可以使用接口来实现多重继承。以下程序演示了这一点-
    
    using System;
    
    namespace InheritanceApplication {
       class Shape {
          public void setWidth(int w) {
             width = w;
          }
          public void setHeight(int h) {
             height = h;
          }
          protected int width;
          protected int height;
       }
    
       // Base class PaintCost
       public interface PaintCost {
          int getCost(int area);
       }
       
       // Derived class
       class Rectangle : Shape, PaintCost {
          public int getArea() {
             return (width * height);
          }
          public int getCost(int area) {
             return area * 70;
          }
       }
       class RectangleTester {
          static void Main(string[] args) {
             Rectangle Rect = new Rectangle();
             int area;
             
             Rect.setWidth(5);
             Rect.setHeight(7);
             area = Rect.getArea();
             
             // Print the area of the object.
             Console.WriteLine("Total area: {0}",  Rect.getArea());
             Console.WriteLine("Total paint cost: ${0}" , Rect.getCost(area));
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Total area: 35
    Total paint cost: $2450
    
上一节:
下一节: