C#中類的繼承是:從一個現有的類中派生新類的類的過程。
而通過繼承,新類自動包括原來的類中的變數和方法。然後,按照需要裁剪這個類,程式員可以增加新的變數到衍生類別中或者修改繼承的類。
總的來說,新類通過繼承可以比重新編寫,來更快、更容易和更廉價地建立。繼承是支援軟體重用的一種方式。(繼承的目的就是重用現有的軟體)。
但是最近看有的資料上說,在繼承中子類並不繼承父類的私人(private)成員。這種說法應該是錯誤的。讓我們明確一下,在繼承中,父類中定義的所有方法和變數,甚至是那些私人(prviate)成員,也由子類繼承。只是這些私人成員不能通過類名或者類的相關對象直接引用。但它們可以間接引用。
讓我們看一個例子來示範這種情況.
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace FoodAnalyzer
6{
7 /**//* FoodItem類表示了食物的一般類型。FoodItem的建構函式接收了脂肪的克數和食物的分數。
8 * Claories方法根據脂肪來返回卡路裡的大小,他觸發了CaloriesPerServing方法來協助計
9 * 算每份的脂肪卡路裡的大小*/
10 public class FoodItem
11 {
12 const int Calories_Per_Gram = 9;
13 private int fatGrams;
14 protected int servings;
15 public FoodItem(int numFatGrams, int numServings)
16 {
17 fatGrams = numFatGrams;
18 servings = numServings;
19 }
20 private int Calories()
21 {
22 return fatGrams * Calories_Per_Gram;
23
24 }
25 public int CaloriesPerServing()
26 {
27 return (Calories()/servings);
28 }
29 }
30 /**//*Pizzs類從FoodItem類派生,但是它沒有增加特殊功能或者資料。它的建構函式使用了base
31 * 引用條用了FoodItem的建構函式,聲明每個匹薩有8份*/
32 public sealed class Pizza : FoodItem
33 {
34 public Pizza(int fatGrams):base(fatGrams,8)
35 {
36
37 }
38 }
39 /**//*Main方法執行個體化了一個Pizza對象,觸發了一個方法來判斷每份匹薩含有多少卡路裡,基於他的脂肪含量。*/
40 class FoodAnalyzer
41 {
42 static void Main(string[] args)
43 {
44 Pizza special = new Pizza(275);
45 Console.Out.WriteLine("Calories per serving:"+special.CaloriesPerServing());
46 Console.In.ReadLine();
47 }
48 }
49}
50
Main方法中的稱為special的Pizza對性用於觸發CaloriesPerServing方法(public),它定義為FoodItem的Public方法,所以Pizza的對象肯定繼承了此方法。注意CaloriesPerServing調用了Calories,它聲明為私人可見度。並且,Calories引用了變數fatGrams和常量Calories_Per_Gram,它們也聲明為私人可見度。
即使Pizza類不能顯示引用Calories、fatGrams或者Calories_Per_Gram,當Pizza對象需要它們時可以間接使用它們。Pizzade對象不能用於觸發Calores方法,但是它可以條用一個可以觸發它的方法。注意從去這這個執行個體中我們沒有建立或者需要FoodItem對象。