面向对象编程中最重要的概念之一是继承。继承允许根据另一个类定义一个类,这样可以更容易地创建和维护应用程序。这也提供了重用代码并加快了代码的实现。
当创建一个类时,程序员可以指定这个新类应该继承现有类的哪些成员,而不是编写继承全部的数据成员和成员函数。这个现有的类称为基类,新类称为派生类或子类。
继承的想法实现了IS-A(是一个什么类?)的关系。 例如,哺乳动物IS是动物,狗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(10)
Rect.setHeight(20)
// Print the area of the object.
Console.WriteLine("Total area: {0}", Rect.getArea())
Console.ReadKey()
}
}
}
当编译和执行上述代码时,会产生以下结果:
Total area: 200
初始化基类
派生类继承基类成员变量和成员方法。 因此,在创建子类之前应该创建超类对象。您可以在成员初始化列表中给出超类初始化的说明或具体实现。
以下程序演示如何实现:
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.5
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()
}
}
}
当编译和执行上述代码时,会产生以下结果: