C # - Kế thừa
Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là tính kế thừa. Tính kế thừa cho phép chúng ta xác định một lớp theo nghĩa của một lớp khác, giúp tạo và duy trì một ứng dụng dễ dàng hơn. Điều này cũng tạo cơ hội để sử dụng lại chức năng mã và tăng tốc thời gian thực hiện.
Khi tạo một lớp, thay vì viết các thành viên dữ liệu hoàn toàn mới và các hàm thành viên, lập trình viên có thể chỉ định rằng lớp mới sẽ kế thừa các thành viên của một lớp hiện có. Lớp hiện có này được gọi làbase lớp và lớp mới được gọi là derived lớp học.
Ý tưởng kế thừa thực hiện IS-Amối quan hệ. Ví dụ, động vật có vúIS A động vật, con chó IS-A động vật có vú do đó chó IS-A động vật cũng vậy, v.v.
Các lớp cơ sở và có nguồn gốc
Một lớp có thể được dẫn xuất từ nhiều lớp hoặc giao diện, có nghĩa là nó có thể kế thừa dữ liệu và chức năng từ nhiều lớp hoặc giao diện cơ sở.
Cú pháp được sử dụng trong C # để tạo các lớp dẫn xuất như sau:
<acess-specifier> class <base_class> {
...
}
class <derived_class> : <base_class> {
...
}
Hãy xem xét một Hình dạng lớp cơ sở và Hình chữ nhật lớp dẫn xuất của nó -
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();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Total area: 35
Khởi tạo lớp cơ sở
Lớp dẫn xuất kế thừa các biến thành viên của lớp cơ sở và các phương thức thành viên. Do đó, đối tượng siêu lớp nên được tạo trước khi lớp con được tạo. Bạn có thể đưa ra các hướng dẫn để khởi tạo lớp cha trong danh sách khởi tạo thành viên.
Chương trình sau đây chứng minh điều này -
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();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Length: 4.5
Width: 7.5
Area: 33.75
Cost: 2362.5
Kế thừa nhiều trong C #
C# does not support multiple inheritance. Tuy nhiên, bạn có thể sử dụng các giao diện để thực hiện đa kế thừa. Chương trình sau đây chứng minh điều này -
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();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Total area: 35
Total paint cost: $2450