1. 程式人生 > >小例子大智慧2--C#中的多型Polymorphism

小例子大智慧2--C#中的多型Polymorphism

以上篇的實體型別為引子,我就直接貼過來了:

Person例項型別:

 public class Person
    {
        public string Name;

        public string Sex;

        public int Age;

        //建構函式,初始化
        public Person()
        {
            this.Name = "張三";
            this.Sex = "男";
            this.Age = 30;
        }

        public string SayHi()
        {
            return "Hell!How are you?";
        }

        //virtual修飾符進行修飾來啟用多型
        public virtual string Hello()
        {
            return "Hell!How are you?";
        }
    }

加了一個Hello方法,並且看到有個字元去修飾,目的就是為了實現重寫

Student例項型別:

 public class Student : Person
    {

        public int CJ;

        //建構函式,初始化
        public Student()
        {
            this.CJ = 90;
        }

        public  string SayHi()//使用new有意隱藏基類方法
        {
            return "你好啊!....";
        }

        public override string Hello()//重寫
        {
            return "你好啊!....";
        }
    }

override重寫hello方法,實現多型

頁面aspx頁面的設計

<body>
    <form id="form1" runat="server">
    <div>
        不用重寫多型:<br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
        重寫多型:<br />
        <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label><br />
        <asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
    </div>
    </form>
</body>

後臺.cs檔案中程式碼

 protected void Page_Load(object sender, EventArgs e)
    {
        //不用重寫多型
        Person[] p = new Person[2];
        p[0] = new Person();
        p[1] = new Student();
        foreach (var l in p)
        {
            if (l is Student)
            {
                Student s = l as Student;
                Label1.Text = s.SayHi();
            }
            else if (l is Person)
            {
                Person t = l as Person;
                Label2.Text = t.SayHi();
            }
        }
        //重寫多型
        Person[] persons = new Person[2];
        persons[0] = new Person();
        persons[1] = new Student();
        int index = 0;
        foreach (var z in persons)
        {
            ++index;
            if (index == 1)
            {
                Label3.Text = z.Hello();
            }
            else
            {
                Label4.Text = z.Hello();
            }
        }

    }

如果不用重寫實現多型的話,第一種方法如果加一個例項類怎麼辦?

第二種能很好的體現出來,不用區分。

頁面顯示結果:

不用重寫多型:
你好啊!....
Hell!How are you?
重寫多型:
Hell!How are you?
你好啊!....

相關推薦

例子智慧2--C#Polymorphism

以上篇的實體型別為引子,我就直接貼過來了: Person例項型別:  public class Person     {         public string Name;         public string Sex;         public int Ag

C++和虛擬函式怎麼回答

1.定義:       多型性可以簡單地概括為“一個介面,多種方法”,程式在執行時才決定呼叫的函式,它是面向物件程式設計領域的核心概念。多型(polymorphism),字面意思多種形狀。   C++多型性是通過虛擬函式來實現的,虛擬函式允許子類重新定義成員函式,而子類重新

C++性和過載

引數傳遞有傳值、傳址和引用三種void f(int n){}//定義傳值方式 int a; f(a);//呼叫傳值方式 void f(int *n){}//定義傳址方式 int a; f(&a);//呼叫傳址方式 void f(int &n){}//定義引用方式 int a; f(a);//呼

C++ 過載 覆蓋

面向物件的三大特徵: 1.封裝:保證物件自身資料的完整性、安全性 2.繼承:建立類之間的關係,實現程式碼複用、方便系統的擴充套件 3.多型:相同的方法呼叫可實現不同的實現方式。多型是指兩個或多個屬於不同類的物件,對於同一個訊息(方法呼叫)作出不同響應的方式。(同樣的

C++的實現原理

多型是面向物件的基本特徵之一。而虛擬函式是實現多型的方法。那麼virtual function到底如何實現多型的呢?1 基類的記憶體分佈情況請看下面的sample class A { void g(){.....} }; 則sizeof(A)=1; 如果改為如下: class A { public:   

c/c++ 繼承與 文字查詢的例子智慧指標版本)

為了更好的理解繼承和多型,做一個文字查詢的小例子。 介面類:Query有2個方法。 eval:查詢,返回查詢結果類QueryResult rep:得到要查詢的文字 客戶端程式的使用方法: //查詢包含Daddy的文字所在的行 Query q("Daddy"); //查詢不包含Alice的

Hibernate的HQL的基本常用例子,單表查詢與表查詢

<span style="font-size:24px;color:#3366ff;">本文章實現HQL的以下功能:</span> /** * hql語法: * 1)單表查詢 * 1.1 全表查詢 * 1.2 指定欄

C#集合組合實現

實現 ram for var fun list() int32 class sin C#中多集合組合使用方法,主要用到 Enumerable.Join方法 var skuInfoList = new Dictionary<int, List<long>&

C/C++學習筆記)2.C++vector的使用

alt double space ons 說明 info 部分 所有 con 說明:vector是C++中一個非常方便的容器類,它用於存放類型相同的元素,利用成員函數及相關函數可以方便的對元素進行增加或刪除,排序或逆序等等,下面將對這些功能一一敘述。 一.vector的第一

滴水穿石 C#線程 委托的使用

兩種方法 例子 圖片 強制 註意 event 檢查 water 過程 什麽是多線程?我們在建立以個C#項目時,往往會在Form1上添加控件,然後寫代碼,初 學者都是在重復這個過程,其實這個過程是單線程的,可以理解為只有“main”主線程,有 的時候往往需要同時測量多個東西,

穴位健康2

小穴位大健康2     紅朝儒生 2011-10-14   關鍵字:小穴位 大健康 李智 簡介:看完了李智的《小穴位大健康2》,做個筆記,希望有用。   目錄 第一章       八大疾病來龍去脈細細

python(2.7)執行緒使用舉例

python(2.7)中多執行緒使用舉例 python27中多執行緒使用舉例 下邊的程式碼都不難理解,不做多餘解釋。唯一有困惑的地方已經在原始碼中註釋說明。這裡也不做多執行緒編碼知識的講解。把這幾種形式(主要是第三種)練成muscle mem

C++繼承實現介面內容封裝例子

        封裝(private中的資料都通過Get與Set來訪問)可以使程式碼模組化,繼承(:)可以擴充套件已存在的程式碼,而多型的目的是為了介面重用(即相同名字的介面可能實現不同的Function功能,因為他們可能可以擴充套件成一個子類)。多型通過

[C++] 實現的一個例子

程式碼: #include <iostream> using namespace std; class Animal { public: virtual void makeSound() { cout << "rawr" &l

一個很短但能夠體現C++的例子

通過用虛擬函式利用基類指標指向其各個派生類,減少了程式碼的冗餘 #include <iostream> using namespace std; class USB { public:

C++執行緒的加鎖機制

問題來源於某面試題: 編寫一個單例模式的類。 #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; class singleStance{

問題思考之C++裡的inline函式

inline,一個神奇的關鍵字。有了它,你同時就可以獲取函式和巨集的優點。inline定義的函式,比起沒有inline的函式來說,沒有執行函式呼叫所帶來的負擔(對此可參見《C++程式的記憶體佈局》),因此它是高效率的;比起巨集來,它具有函式的可預期行為和引數型別檢驗。巨集的

c++個執行緒使用同一個函式

我是小白,最近在學習實現一個簡單的執行緒池,執行緒池中維護了一個存放執行緒的陣列以及一個任務佇列。在建立執行緒池(建構函式中)時建立若干個執行緒,起始時由於任務佇列中沒有任務,建立的每一個執行緒都處於阻塞狀態。使用pthread_create函式建立執行緒時把所有的執行緒與

C++繼承建構函式呼叫順序

class B1 {public: B1(int i) {cout<<"consB1"<<i<<endl;} };//定義基類B1 class B2 {public: B2(int j) {cout<<"consB2"<<

c#維陣列技術性能比較

源地址:http://www.cnblogs.com/yongbufangqi1988/archive/2010/06/10/1755863.html 多維陣列的三種技術:安全陣列訪問技術、安全交錯陣列訪問技術和非安全指標訪問技術。 時間 = 陣列生成時間 + 陣列元素