1. 程式人生 > >C#類的方法:過載,從寫,虛擬函式,抽象函式,隱藏基類方法!

C#類的方法:過載,從寫,虛擬函式,抽象函式,隱藏基類方法!

    CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記

1:過載   方法過載的主要好處就是,不用為了對不同的引數型別或引數個數,而寫多個函式。

      特點:函式名稱必須一樣,返回型別可以不一樣,引數可以不一樣。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DeepCopy
{
    class A
    {
        private int a;
        public int aa
        {
            set { a = value; }
            get
            {

                if (a > 0)
                    return a;
                else
                {
                    return a = a + 1;
                }
            }
        }
        public void Get_A()
        {
            Console.WriteLine("過載(1):" + this.aa.ToString());
        }
        public void Get_A(int i)
        {
            Console.WriteLine("過載(2):" + (this.aa * i).ToString());
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            A testA1 = new A();
            testA1.Get_A();
            testA1.Get_A(4);
            Console.Read();

        }
    }
}

結果:

2:虛擬函式(virtual),重寫(override)

      virtual關鍵字說明了這個函式可以被子類從寫。

      override關鍵字說明了這是從寫的父類的函式。

      從寫將替換父類中的函式的實現程式碼。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DeepCopy
{
    class A
    {
        private int a;
        public int aa
        {
            set { a = value; }
            get
            {

                if (a > 0)
                    return a;
                else
                {
                    return a = a + 1;
                }
            }
        }
        public virtual void Get_A()//說明此函式為虛擬函式,說明可以在子類中從寫!
        {
            Console.WriteLine("我是父類的:" + this.aa.ToString());
        }
    }

    class B : A
    {

        public override void Get_A()//重寫父類的虛擬函式
        {
            Console.WriteLine("重寫父類的函式:" + (this.aa + this.aa).ToString());
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            //父類先呼叫被重寫的方法(虛擬函式),
            A testA1 = new A();
            testA1.Get_A();


            //通過自身呼叫重寫的方法
            B testB = new B();
            testB.Get_A();


            //轉換成父類的型別,通過父類型別物件呼叫,發現也被修改了!
            A testA2 = testB;
            testA2.Get_A();
            Console.Read();

        }
    }
}

結果:

3:隱藏函式

     從父類繼承的函式沒有像預期的那樣工作的時候,我們就可以隱藏它,從新進行實現。被隱藏的函式不需要用virtual關鍵字指明,從新實現也不需要用override

     隱藏函式,如名,父類的函式並沒有被覆蓋。通過父類物件仍然可以呼叫。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DeepCopy
{
    class A
    {
        private int a;
        public int aa
        {
            set { a = value; }
            get
            {

                if (a > 0)
                    return a;
                else
                {
                    return a = a + 1;
                }
            }
        }
        public void Get_A()
        {
            Console.WriteLine("我是父類的:" + this.aa.ToString());
        }
    }

    class B : A
    {

        new public void Get_A()  //如果沒有new關鍵字,會發生警告!不過即使沒有new關鍵字,也不影響使用。
        {
            Console.WriteLine("我是隱藏父類後的函式:" + (this.aa + this.aa).ToString());
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            //父類先呼叫被重寫的方法(虛擬函式),
            A testA1 = new A();
            testA1.Get_A();


            //通過自身呼叫重寫的方法
            B testB = new B();
            testB.Get_A();


            //轉換成父類的型別,通過父類型別物件呼叫,發現也被修改了!
            A testA2 = testB;
            testA2.Get_A();
            Console.Read();

        }
    }
}

結果:

4: 抽象函式

    抽象類中通過abstract定義抽象函式,抽象函式不能再抽象類中進行實現,並且必須在非抽象類的子類中實現。

    子類需要通過override關鍵字指定這是從寫的父類的函式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DeepCopy
{
    abstract class A//不能例項化物件!
    {
        private int a;
        public int aa
        {
            set { a = value; }
            get
            {

                if (a > 0)
                    return a;
                else
                {
                    return a = a + 1;
                }
            }
        }
        public abstract void Get_A();//抽象函式在父類中,不能實現;
       
    }

    class B : A
    {

        public override void Get_A()  //必須從寫抽象父類的抽象函式
        {
            Console.WriteLine("我是從寫抽象父類的抽象函式後的:" + (this.aa + this.aa).ToString());
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            B testB = new B();
            testB.Get_A();
            Console.Read();

        }
    }
}

結果:

好了。大概C#就這幾種容易混亂的函式!就這樣。 

相關推薦

C#方法過載虛擬函式抽象函式隱藏方法

    CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記 1:過載   方法過載的主要好處就是,不用為了對不同的引數型別或引數個數,而寫多個函式。       特點:函式名稱必須一樣,返回型別可以不一樣,引數可以不一樣。 using System

【無私分享入門到精通ASP.NET MVC】0開始一起搭框架、做專案(6) 控制器 主要做登入使用者、許可權認證、日誌記錄等工作

索引 簡述 今天我們來寫一個控制器基類 主要做登入使用者、許可權認證、日誌記錄等工作 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,

effective c++ 條款06若不想使用編譯器自動生成的函數就該明確拒絕

ble 這樣的 ive c++ 拒絕 類對象 析構 並且 防止 記住:為防止編譯器暗自提供的功能,可將相應的成員函數聲明為privae並且不予實現。也可以使用Uncopyable這樣的父類實現。 對於獨一無二的對象,希望不支持拷貝構造函數和賦值操作符。 class Hom

C++解析(25)關於動態內存分配、虛函數和繼承中強制型轉換的疑問

cas ror src 一個 聲明 eof struct 定義 namespace 0.目錄 1.動態內存分配 1.1 new和malloc的區別 1.2 delete和free的區別 2.虛函數 2.1 構造函數與析構函數是否可以成為虛函數? 2.2 構造函數與析構

C# 隱藏方法和Partial

C# 類中隱藏基類方法和Partial 時間 2014-11-14 11:50:03   薑糖水 原文   http://www.cnphp6.com/archives/60699

C#自己的32位MD5加密函式

大體思路都是,MD5加密後得到byte型別的陣列,然後將每個陣列成員轉換成16進位制的string字串,這裡就容易產生BUG,因為轉換成16進位制時,遇到10以內的數字時,轉後都是一個單字元的,但我們每次轉換都要得到兩個字元的字串,網上大多數都沒有考慮到這個,導致加密結果出現

有五個學生每個學生有3門課的成績 鍵盤輸入以上資料(包括姓名三門課成績) 輸入的格式zhagnsan304060計算出總成績 並把學生的資訊和計算出的總分數高低順序存放在磁碟文

有五個學生,每個學生有3門課的成績, 從鍵盤輸入以上資料(包括姓名,三門課成績), 輸入的格式:如:zhagnsan,30,40,60計算出總成績, 並把學生的資訊和計算出的總分數高低順序存放在磁碟檔案"stud.txt"中。 1:定義一個描述學生的類2定義一個操作學生的工

約瑟夫環問題有n個人排成一列或是一圈編號為k的人開始報數數到m的那個人出列。(Java實現)

文章目錄1.題目2.解析3.總程式碼 約瑟夫環問題 約瑟夫環描述:約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又

ACMNO.44 C語言-平均分 有N個學生每個學生的資料包括學號、姓名、3門課的成績,從鍵盤輸入N個學生的資料要求打印出3門課的總平均成績以及最高分的學生的資料(包括學號、姓名、3門課成績)

題目描述 有N個學生,每個學生的資料包括學號、姓名、3門課的成績, 從鍵盤輸入N個學生的資料, 要求打印出3門課的總平均成績,以及最高分的學生的資料 (包括學號、姓名、3門課成績) 輸入 學生數量N佔一行每個學生的學號、姓名、三科成績佔一行,空格分開。 輸出 各門

徹底解密C++寬字元1、char到wchar_t

<本文PDF文件下載>“這個問題比你想象中複雜”(我也學下BS的風格,雖然這句話是我自己臨時想說的。^^)從字元到整數char是一種整數型別,這句話的含義是,char所能表示的字元在C/C++中都是整數型別。好,接下來,很多文章就會舉出一個典型例子,比如,'a

機器學習中樣本集合分得訓練集、測試集的三種方法

一、為什麼要分開訓練集與測試集 在機器學習中,我們是依靠對學習器的泛化誤差進行評估的方法來選擇學習器。具體方法如下:我們需要從訓練集資料中產出學習器,再用測試集來測試所得學習器對新樣本的判別能力,以測試集上的測試誤差作為泛化誤差的近似,來選取學習器。 通常我

C++知識積累過載隱藏和重寫的區別

基本概念: 過載:是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。 示例: class A{ public: void test(int a); void test(double a)

C#中自定義控制元件隱藏成員(屬性、方法和事件)的方法

       編寫自定義控制元件時,總是繼承C#中提供的Control類,而Control類是C#中所有窗體控制元件的基類,裡面定義了大量的屬性、方法和事件,而很多基類成員在自定義控制元件中可能不需要,因為編寫者會希望在自定義控制元件中隱藏這些成員,避免使用者呼叫這些成員。

C#操作Xml通過XmlDocument讀Xml文件

轉自:http://www.cnblogs.com/yukaizhao/archive/2011/07/19/csharp_xmldocument_access_xml.html Xml是擴充套件標記語言的簡寫,是一種開發的文字格式。關於它的更多情況可以通過

判斷101-200之間有多少個素數並輸出所有素數。 程式分析判斷素數的方法用一個數分別去除2到sqrt(這個數)如果能被整除 則表明此數不是素數反之是素數。

題目:判斷101-200之間有多少個素數,並輸出所有素數。  程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。 package bbb; /*  * 判斷101-200之間有多少個素數,並輸出所有素數。 

當你輸入信用卡號碼的時候有沒有擔心輸錯了而造成損失呢?其實可以不必這麼擔心因為並不是一個隨便的信用卡號碼都是合法的它必須通過Luhn演算法來驗證通過。 該校驗的過程1、卡號最後一位數字開始

import java.util.Scanner; /** * 當你輸入信用卡號碼的時候,有沒有擔心輸錯了而造成損失呢?其實可以不必這麼擔心, * 因為並不是一個隨便的信用卡號碼都是合法的,它必須通過Luhn演算法來驗證通過。 該校驗的過程: 1、從卡號最後一位數字

劍指offer(九) 棧的壓入彈出序列上往下列印二叉樹二叉搜尋樹的後序遍歷序列

棧的壓入、彈出序列 題目描述 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出

給定一個數組和一個數(該數不一定在陣列中)數組裡刪掉這個數字返回剩下的陣列長度。

給定一個數組和一個數(該數不一定在陣列中),從數組裡刪掉這個數字,返回剩下的陣列長度。 如:A[] = {1, 2, 3, 4, 5}要刪除數字 3,那麼返回陣列長度為 4。 親愛的小夥伴們,題目是不是很簡單呢? 提示:int removeElement(int

C#中要自己手動在派生的建構函式中逐一的初始化的欄位嗎

public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[