1. 程式人生 > >C#中類的繼承

C#中類的繼承

本節課將介紹C#中的繼承,其目的如下:
1.基類的實現

2.類的繼承

3.在派生類中初始化基類

4.如何呼叫基類成員

5.如何覆蓋基類成員

繼承是面向物件程式設計的主要特徵之一,它可以讓你重用程式碼,可以節省程式設計的時間。

1.清單8-1 繼承: BaseClass.cs

using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I''m a Parent Class.");
}
}

public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}

Output:

Parent Constructor.
Child Constructor.
I''m a Parent Class.

說明

清單8-1演示了兩個類的用法。上面的一個類名為ParentClass, main函式中用到的類名為ChildClass。要做的是建立一個使用父類ParentClass現有程式碼的子類ChildClass。

1.首先必須說明ParentClass是ChildClass的基類。

這是通過在ChildClass類中作出如下說明來完成的:"public class ChildClass : ParentClass"。在派生類識別符號後面,用分號":" 來表明後面的識別符號是基類。C#僅支援單一繼承。因此,你只能指定一個基類。

2.ChildClass的功能幾乎等同於ParentClass。

因此,也可以說ChildClass "就是" ParentClass。在ChildClass 的Main()方法中,呼叫print() 方法的結果,就驗證這一點。該子類並沒有自己的print()方法,它使用了ParentClass中的 print()方法。在輸出結果中的第三行可以得到驗證。

3.基類在派生類初始化之前自動進行初始化。

注意到清單8-1的輸出結果。ParentClass 類的建構函式在ChildClass的建構函式之前執行。

2.清單 8-2. 派生類同基類進行通訊: BaseTalk.cs

using System;
public class Parent
{
string parentString;
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{
Console.WriteLine("I''m a Parent Class.");
}
}

public class Child : Parent
{
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
public void print()
{
base.print();
Console.WriteLine("I''m a Child Class.");
}

public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}

Output:

From Derived
Child Constructor.
I''m a Parent Class.
I''m a Child Class.
I''m a Parent Class.


說明

1.派生類在初始化的過程中可以同基類進行通訊。

清單8-2演示了在子類的建構函式定義中是如何實現同基類通訊的。分號":"和關鍵字base用來呼叫帶有相應引數的基類的建構函式。輸出結果中,第一行表明:基類的建構函式最先被呼叫,其實在引數是字串"From Derived"。

2.有時,對於基類已有定義的方法,打算重新定義自己的實現。

Child類可以自己重新定義print()方法的實現。Child的print()方法覆蓋了Parent中的 print 方法。結果是:除非經過特別指明,Parent類中的print方法不會被呼叫。

3.在Child類的 print() 方法中,我們特別指明:呼叫的是Parent類中的 print() 方法。

方法名前面為"base",一旦使用"base"關鍵字之後,你就可以訪問基類的具有公有或者保護許可權的成員。 Child類中的print()方法的執行結果出現上面的第三行和第四行。

4.訪問基類成員的另外一種方法是:通過顯式型別轉換。

在Child類的Main()方法中的最後一條語句就是這麼做的。記住:派生類是其基類的特例。這個事實告訴我們:可以在派生類中進行資料型別的轉換,使其成為基類的一個例項。清單8-2的最後一行實際上執行了Parent類中的 print()方法。

小結
你已經瞭解瞭如何建立一個派生類及其基類。你可以對基類成員進行初始化,以及如何對方法進行隱式或者顯式的呼叫。你也瞭解了派生類是其基類的一個特例。

相關推薦

C繼承

本節課將介紹C#中的繼承,其目的如下: 1.基類的實現 2.類的繼承 3.在派生類中初始化基類 4.如何呼叫基類成員 5.如何覆蓋基類成員 繼承是面向物件程式設計的主要特徵之一,它可以讓你重用程式碼,可以節省程式設計的時間。 1.清單8-1 繼承: Base

C的介面和繼承多型

 上一節中我們學習到了建構函式,用來初始化一個物件的例項。同時在.NET Framework中,提供了解構函式用於清理物件。一般情況下不需要特別解構函式,系統會自動提供預設的解構函式來執行操作,清理不再需要的物件。 一、 靜態和例項類成員 屬性,方法和欄位等成員是物件例項所

C誰最快:結構還是

前言 在記憶體當道的日子裡,無論什麼時候都要考慮這些程式碼是否會影響程式效能呢? 在現在的世界裡,幾乎不會去考慮用了幾百毫秒,可是在特別的場景了,往往這幾百毫米確影響了整個專案的快慢。 通過了解這兩者之間的效能差異,希望幫助大家在合適的場景裡選擇正確的編碼。 例項 public class PointCl

Telerik UI for ASP.NET AJAX教程:C的函式程式設計

【下載Telerik UI for ASP.NET AJAX最新版本】 在面向物件程式設計(OOP)中,我們習慣於使用物件集合或簡單資料型別。我們經常使用LINQ對這些集合進行排序和過濾,作為業務邏輯行為或資料轉換的一部分。雖然這些是我們經常執行的有用任務,但很容易忘記C#中的函式可以被視為資料

【FastReport教程】介紹C的非同步程式設計(下)

【下載FastReport.Netdownload最新版本】 非同步程式設計模型出現在.Net Framework的第一個版本中。APM允許使用兩種方法建立同步方法的非同步版本 - Begin 和End 。 所以,只有兩種方法: public IAsyncResult Begin{MethodName}(

C++的繼承,多型和虛擬函式

首先繼承,多型,虛擬函式,我們先了解一下各位的關係。 繼承是子類繼承父類,完成基礎功能的獲取,當然繼承有三種許可權,public,protect和private,如果不加許可權限定,預設繼承是私有繼承。 許可權表如下: 所以可以看到凡私有成員,子類都不能用,不過有方法能用,這裡不討

[譯]聊聊C的泛型的使用(新手勿入)

寫在前面 今天忙裡偷閒在瀏覽外文的時候看到一篇講C#中泛型的使用的文章,因此加上本人的理解以及四級沒過的英語水平斗膽給大夥進行了翻譯,當然在翻譯的過程中發現了一些問題,因此也進行了糾正,當然,原文的地址我放在最下面,如果你的英文水平比較好的話,可以直接直接閱讀全文。同時最近建了一個.NET Core實戰專案

C的尋路演算法

目錄 介紹 問題 Dijkstra演算法 A *演算法 結果 結論 挑戰 Dijkstra和Astar的比較 Download source - 571.3 KB 在Visual Studio 2017中解壓縮並開啟解決方案 介紹 你有沒

C修改加密PDF的密碼

修改PDF檔案的密碼確實是一個理性的選擇,特別是當某人知道密碼並且您的PDF檔案不再安全時。 Spire.PDF for .NET允許您在C#中修改加密PDF檔案的密碼。您可以修改所有者密碼以及使用者密碼,並在訪問PDF檔案時設定使用者限制。現在請檢視修改加密PDF密碼的過程如下圖所示:

詳解C++程式設計的宣告和物件成員的引用

C++類的宣告和物件的建立 類是建立物件的模板,一個類可以建立多個物件,每個物件都是類型別的一個變數;建立物件的過程也叫類的例項化。每個物件都是類的一個具體例項(Instance),擁有類的成員變數和成員函式。 與結構體一樣,類只是一種複雜資料型別的宣告,不佔用記憶體空間。而物件是類這種資料型別的一個變

C++11資料成員初始化方法詳解

C++98為類中提供類成員的初始化列表。 類物件的構造順序是這樣的:1.分配記憶體,呼叫建構函式時,隱式/顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算   1.類裡面的任何成員變數在定義時是不能初始化的。   2.一般的資料成員可以在建構函式中初始化。   3.const資料成員必須在

C的“裝箱”(boxing)與“拆箱”(unboxing)

裝箱和拆箱:任何值型別、引用型別可以和object(物件)型別之間進行轉換。裝箱轉換是指將一個值型別隱式或顯式地轉換成一個object型別,或者把這個值型別轉換成一個被該值型別應用的介面型別(interface-type)。把一個值型別的值裝箱,就是建立一個object例項並

C++11繼承建構函式

時間:2014.06.19 地點:基地 ------------------------------------------------------------------------- 一、問題描述   在繼承體系中,如果派生類想要使用基類的建構函式,需要在建構函式中顯式

【教程】PDF控制元件Spire.PDF 教程:在C加密和解密PDF檔案

請注意,該教程只適用Spire.PDF 3.9.421及其以上版本。該教程顯示瞭如何使用C#通過以下兩個部分使用密碼來保護和取消保護PDF檔案: 加密PDF解密PDF 加密PDF 有兩種密碼可以用於加密PDF,開啟密碼和修改密碼。 開啟的密碼只設置為開啟密碼。 修改密碼

C多重IF和巢狀IF

1. 多重IF結構 如果IF條件需要分成多種情況時,將要用到多重IF條件的用法,即else –if結構,這的語法如下: If(條件1)   { 語句塊1;    } Else if(條件2)   {       語句塊2;   } …. Else if(條件n)   {   語句塊n;   } [else

C++程式設計CALSS的編寫(一):不含指標資料的

首先,在我理解當中,C++程式設計中的類可以分為兩種型別,第一種是包含指標的,另一種則是不包含的,不包含指標的類,其中private裡填寫自己的資料,這時候其中的資料型別比如int,double,float等等型別都是標準庫裡面已經寫好的,也自動為我們分配了記憶體,不用去考

c公共直接呼叫方法

公共類直接調方法    C# codeusing System;using System.Collections.Generic;using System.Data;using System.Data.OracleClient;using System.Web.UI.WebC

C的域(field)和屬性(property)_C#教程

訪問一個類的成員變數可以有兩種方式:域、屬性。域作為public型別的成員變數訪問,而屬性不能直接進行訪問,必須通過訪問器(accessors)進行。 域(field) 域(field) -域表示與物件或類相關聯的變數。 -域的宣告中如果加上了readonly修飾符

C++/Java__模板的靜態成員變數和靜態成員函式

C++: 類模板例項化的每個模板類(每個模板類指的是對於宣告時候對模板指定的型別,如List<int>,List<double>中的int,double.)都有自己的類模板靜

C的RDLC報告

height www repo master http 綁定 構建 winform spa 介紹 此示例顯示如何在C#中生成RDLC報告,您可以為小型,中型和大型企業生成報告。 構建示例 Visual Studio 2013,.Net Frameworm 4.5,MS