亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

.NET零基礎入門06:面向對象入門

2019-11-14 16:05:38
字體:
來源:轉載
供稿:網友

一:前言

在本系列課程的第一部分,我們說明為了要選擇C#作為你成為程序員的第一門語言:

? 首先,C#是一門非常優秀的面向對象編程的語言;

凡是對編碼感興趣的同學一定聽說過“面向對象編程”這個概念,C#就是為此誕生的,它天然是面向對象的。所以,既然“面向對象編程”是當前IT界的主流,我們選擇C#就沒有偏離主流方向。

本節,我們就要講講什么是面向對象,以及面向對象開發中最重要,最應該掌握的概念。

 

二:什么是面向對象

“面向對象”是當前軟件開發的一個主流思想,它有三個主要特征:封裝、繼承、多態。很多軟件開發的教程使用了阿貓阿狗的例子來講面向對象,其實說明了“面向對象”在某種意義上是很好理解的概念。我們已經在之前的例子中講過了“類”這個概念,現在我們就來講講抽象類,接口。當然,我們不打算用阿貓阿狗的例子(阿貓阿狗都是動物,動物都有吃喝拉撒的習慣……,但是阿貓有阿貓的喵喵叫,阿狗有阿狗的汪汪叫……),我們在這里舉一個實際的例子,只不過,需要大家活動思維,主動將概念聯系到阿貓阿狗中去。

這個實際的例子是.Net Framework基礎類庫(以后簡稱:FCL)中的三個類Stream、FileStream 、MemoryStream ,如下:

public abstract class Stream
{
    public abstract void Write(byte[] buffer, int offset, int count);
}

public class FileStream : Stream
{
    public override void Write(byte[] array, int offset, int count)
    {
    }
}

public class MemoryStream : Stream
{
    public override void Write(byte[] buffer, int offset, int count)
    {
    }

這三個是負責byte讀寫的類,我只拿出了其中一個方法Write。

(Tip:什么是byte?,程序中的數據會以byte的形式存在,我們只要知道,讀寫內容,如字符串、整數,到內存中,到文件中,實際讀寫的就是byte就行了)

1:什么是封裝?

一句話概括:像上面這樣,將代碼分類到不同的類中,實際就是封裝。

2:什么是繼承?

像上面這樣,有父類Stream,有兩個子類,就叫做繼承。如果要講繼承,我們就需要講解下訪問限制符了。

2.1什么是類型的訪問限制符?

在C#中,可以為類型,如Stream類,或者類型的成員,如Write方法,添加訪問限制符。在C#的世界中,我們將類型和類型的成員所在的可見范圍分為如下幾類(注意,只講解最常用的):

a)在整個應用程序內可見

使用public修飾。

b)在當前項目內可見

使用internal修飾。

c)在當前類型內部可見

使用PRivate修飾。該修飾符主要修飾類型的成員。

d)僅在子類中可見

使用protected修飾。該修飾符主要修飾類型的成員。

需要強調的是,類型的默認訪問限制符是internal,如果我們不加任何修飾符,.NET編譯器就會默認此類型為internal。類型的成員的訪問限制符是private。

好了,現在不妨停下來,自己創建一些類型和類型成員,感悟下對訪問限制符的理解吧。

2.2什么是抽象類?

如何創建一個類的對象?使用new,如下:

Stream stream = new Stream();

但是這段代碼你一定執行不了,因為Stream是抽象類,它被abstract修飾著。既然抽象類new不了?那它有什么意義呢?

  a)首先,它可以定義一些抽象的方法abstract method,抽象方法表達了這樣一個意思:嗨,子類,你必須實現我這個方法;

  b)其次,抽象類可以有一些常規的非abstract的方法,也就是說,我們可以把一些子類中相同的邏輯,放到這個抽象方法中,這樣就不需要相同的代碼在不同的子類中都去寫一遍了。

2.3什么是接口?

如果一個抽象類,只有抽象方法,而沒有常規方法,那么我們可以考慮將它抽象為接口(interface)。一個簡單的接口的例子如下:

interface IDispose
{
    void Dispose();

那么,什么時候用接口,什么時候用抽象類呢?這個問題問的很好,但是,別著急,作為初學者,我們是很難把握這個標準的,對于現在的我們來說,我們只要直接.NET的世界中,存在類、抽象類、接口就可以了,嘗試一口氣全部弄明白,往往屬于揠苗助長。

3:什么是多態?

一句話概括之:讓子類有自己的行為,就是多態。好吧,其實,多態可不是一句話能概括的,我們來具體看看多態的具體含義及實現手段。

 

三:多態的具體含義及實現手段

備注:以下內容摘自我所撰寫的書《高質量代碼編寫:改善C#的157個建議》。注意,要完全掌握多態的含義及實現手段,必須通過自己編寫代碼細細品味才行,請按照本文下面的例子來體會。

override和new使我們的類型體系因為繼承而呈現出多態性。多態是一門語言是否是“面向對象語言”的三個重要特性之一。多態要求子類具有與基類方法同名的方法,而override和new的作用就是:

如果子類中的方法前面帶有new關鍵字,則該方法被定義為獨立于基類的方法。

如果子類中的方法前面帶有override關鍵字,則子類的對象將調用該方法,而不是調用基類方法。

這兩個定義看上去有些抽象,要深刻理解它們之間的區別,我們不妨來看一個繼承體系:

public class Shape
{
    public virtual void MethodVirtual()
    {
        Console.WriteLine("base MethodVirtual call");
    }

    public void Method()
    {
        Console.WriteLine("base Method call");
    }
}

class Circle : Shape
{
    public override void MethodVirtual()
    {
        Console.WriteLine("circle override MethodVirtual");
    }
}

class Rectangle : Shape
{
}

class Triangle : Shape
{
    public new void MethodVirtual()
    {
        Console.WriteLine("triangle new MethodVirtual");
    }

    public new void Method()
    {
        Console.WriteLine("triangle new Method");
    }

}

class Diamond : Shape
{
    public void MethodVirtual()
    {
        Console.WriteLine("Diamond default MethodVirtual");
    }

    public void Method()
    {
        Console.WriteLine("Diamond default Method");
    }
}

查看上面的繼承體系,類型Shape是所有子類的基類。

Circle類override了父類的MethodVirtual,所以即使子類轉型為了Shape,調用的還是子類的方法:

    Shape s = new Circle()

    s.MethodVirtual();

    s.Method();

輸出:

    circle override MethodVirtual

    base Method call

當然,Circle的第二種用法很好理解。使用子類本身的類型,調用的則全部是子類的方法,如下所示:

    Circle circle = new Circle();

    circle.MethodVirtual();

    circle.Method();

輸出也是:

    circle override MethodVirtual

    base Method call

類型Rectangle沒有對基類做任何處理,所以無論子類是否轉型為Shape,調用的都是基類Shape的方法。

類型Triangle將基類Shape的virtual方法和非virtual方法都new了一遍。所以第一種用法為:

    Shape s = new Triangle()

    s.MethodVirtual();

    s.Method();

因為子類已經new了父類的方法,故子類方法和基類方法完全沒有關系了,只要s被轉型為Sharp,則針對s調用的都是父類方法。

第二種用法很好理解,調用的都是子類的方法,如下所示:

    Triangle triangel = new Triangle();

    triangel.MethodVirtual();

    triangel.Method();

輸出:

    triangle new MethodVirtual

    triangle new Method

類型Diamond,包含了兩個和基類一模一樣的方法,并且沒有額外的修飾符。這在編輯器中會提出警示。但是如果選擇忽略這些警示,程序一樣還是可以運行。它的第一種用法為:

    Shape s = new Diamond()

    s.MethodVirtual();

    s.Method();

編譯器會默認new的效果,所以輸出和顯式new修飾的一樣。

輸出:

    base MethodVirtual call

    base Method call

在Diamond的第二種用法中,全部調用的是子類的方法,如下所示:

    Diamond diamond = new Diamond();

    diamond.MethodVirtual();

    diamond.Method();

輸出:

    Diamond default MethodVirtual

    Diamond default Method

我們總結一下以上所有的用法,并給出一個綜合示例,讀者可以仔細體會每種用法所帶來的輸出變化:

static void Main(string[] args)
{
    TestShape();
    TestDerive();
    TestDerive2();
}

private static void TestShape()
{
    Console.WriteLine("TestShape/tStart");
    List<Shape> shapes = new List<Shape>();
    shapes.Add(new Circle());
    shapes.Add(new Rectangle());
    shapes.Add(new Triangle());
    shapes.Add(new Diamond());
    foreach (Shape s in shapes)
    {
        s.MethodVirtual();
        s.Method();
    }

    Console.WriteLine("TestShape/tEnd/n");
}

private static void TestDerive()
{
    Console.WriteLine("TestDerive/tStart");
    Circle circle = new Circle();
    Rectangle rectangle = new Rectangle();
    Triangle triangel = new Triangle();
    Diamond diamond = new Diamond();
    circle.MethodVirtual();
    circle.Method();
    rectangle.MethodVirtual();
    rectangle.Method();
    triangel.MethodVirtual();
    triangel.Method();
    diamond.MethodVirtual();
    diamond.Method();
    Console.WriteLine("TestShape/tEnd/n");
}

private static void TestDerive2()
{
    Console.WriteLine("TestDerive2/tStart");
    Circle circle = new Circle();
    PrintShape(circle);
    Rectangle rectangle = new Rectangle();
    PrintShape(rectangle);
    Triangle triangel = new Triangle();
    PrintShape(triangel);
    Diamond diamond = new Diamond();
    PrintShape(diamond);
    Console.WriteLine("TestDerive2/tEnd/n");

}

static void PrintShape(Shape sharpe)
{
    sharpe.MethodVirtual();
    sharpe.Method();
}

輸出:

TestShape Start

circle override MethodVirtual

base Method call

base MethodVirtual call

base Method call

base MethodVirtual call

base Method call

base MethodVirtual call

base Method call

TestShape End

TestDerive Start

circle override MethodVirtual

base Method call

base MethodVirtual call

base Method call

triangle new MethodVirtual

triangle new Method

Diamond default MethodVirtual

Diamond default Method

TestShape End

TestDerive2 Start

circle override MethodVirtual

base Method call

base MethodVirtual call

base Method call

base MethodVirtual call

base Method call

base MethodVirtual call

base Method call

TestDerive2 End

 

四:某個同學的比較差的記錄

視頻部分非公開,請聯系最課程(www.zuikc.com)。

微信掃一掃,關注最課程(www.zuikc.com),獲取更多我的文章,獲取軟件開發每日一練


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩高清| 久久97久久97精品免视看| 欧美有码在线观看| 国产日产久久高清欧美一区| 亚洲性猛交xxxxwww| 丁香五六月婷婷久久激情| 久久99久久亚洲国产| 亚洲第一精品久久忘忧草社区| 中文字幕精品在线视频| 欧美亚洲视频在线看网址| 奇门遁甲1982国语版免费观看高清| 久久久精品日本| 久久久亚洲福利精品午夜| 国产999精品久久久| 国产午夜精品全部视频在线播放| 国产精品久久久久久久久久| 成人激情在线播放| 国产成人精品在线| 日本一欧美一欧美一亚洲视频| 亚洲一区二区三区毛片| 亚洲视频在线免费看| 久久久久久成人| 国产精品久久久久久久一区探花| 国产成人综合久久| 亚洲欧美日韩一区二区三区在线| 91在线观看免费高清完整版在线观看| 欧美日韩激情美女| 青青草99啪国产免费| 亚洲国产小视频在线观看| 欧美激情视频免费观看| 色99之美女主播在线视频| 在线日韩欧美视频| 久久久久久久久久久国产| 午夜精品久久久久久久99热| 91国偷自产一区二区三区的观看方式| 正在播放亚洲1区| 91欧美精品午夜性色福利在线| 欧美日韩综合视频网址| 一区二区日韩精品| 96精品久久久久中文字幕| 国产精品中文字幕久久久| 久久久中文字幕| 亚洲尤物视频网| 中文字幕日韩在线播放| www.日韩不卡电影av| 亚洲第一视频网站| 亚洲xxxxx电影| 久久综合色88| 欧美激情欧美激情在线五月| 欧美在线www| 欧美视频在线免费看| 日韩久久午夜影院| 国产日韩中文字幕在线| 在线a欧美视频| 1769国内精品视频在线播放| 91黑丝高跟在线| 成人天堂噜噜噜| 久久福利网址导航| 91精品久久久久久久久久久久久| 欧美一级淫片aaaaaaa视频| 97成人精品视频在线观看| 米奇精品一区二区三区在线观看| 51色欧美片视频在线观看| 国产日韩精品电影| 一区二区成人av| 国产精品永久在线| 日韩高清人体午夜| 日韩成人av在线| 欧美性20hd另类| 国产中文欧美精品| 国产脚交av在线一区二区| 久久不射电影网| 国产成人一区二区在线| 欧美在线激情视频| 亚洲第一网站免费视频| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品久久久久久亚洲影视| 久久夜精品va视频免费观看| 欧美专区第一页| 国产精品高潮呻吟久久av黑人| 日韩欧美中文字幕在线观看| 98精品国产自产在线观看| 精品亚洲一区二区三区| 亚洲在线www| 亚洲自拍偷拍区| 亚洲人成欧美中文字幕| 国产午夜精品一区理论片飘花| 国产成人精品最新| 日韩最新av在线| 欧美日韩亚洲精品内裤| 96国产粉嫩美女| 97香蕉超级碰碰久久免费的优势| 一本色道久久综合亚洲精品小说| 国产精品久久久久久久久久免费| 亚洲精品suv精品一区二区| 亚洲精品国产电影| 伦伦影院午夜日韩欧美限制| 成人福利视频在线观看| 91在线高清免费观看| 26uuu久久噜噜噜噜| 亚洲国产成人精品久久| www.久久色.com| 91av中文字幕| 国产免费观看久久黄| 91福利视频在线观看| 91精品在线国产| 91国产美女在线观看| 成人网在线免费看| 国产成人精品在线观看| 国产精品福利无圣光在线一区| 日韩精品极品毛片系列视频| 国产区亚洲区欧美区| 国产亚洲精品久久久| 亚洲电影中文字幕| 日韩中文字幕视频| 亚洲成人av中文字幕| 51精品国产黑色丝袜高跟鞋| 92看片淫黄大片欧美看国产片| 久久理论片午夜琪琪电影网| 欧美精品激情视频| 美女啪啪无遮挡免费久久网站| 欧美成人免费网| 国产精品99久久久久久人| 日本最新高清不卡中文字幕| 日韩专区在线播放| 亚洲国产一区二区三区在线观看| 57pao成人国产永久免费| 亚洲精品www久久久久久广东| 久久人人97超碰精品888| 日韩欧美国产成人| 国产精品电影网| 久久亚洲一区二区三区四区五区高| 欧美性在线观看| 91精品视频免费看| 欧美日韩免费区域视频在线观看| 日韩在线观看电影| 国产精品久久久久久久av电影| 久久国产精品久久精品| 亚洲欧洲偷拍精品| 亚洲精品资源美女情侣酒店| 欧美极品少妇xxxxx| 欧美日韩成人免费| 久久国产加勒比精品无码| 久久久久久久久91| 日韩欧美亚洲国产一区| 91国内免费在线视频| 亚洲第一精品夜夜躁人人爽| 亚洲经典中文字幕| 精品欧美激情精品一区| 国产精品人成电影| 欧美丰满老妇厨房牲生活| 亚洲欧美中文在线视频| 久久综合免费视频| 成人h视频在线观看播放| 欧洲午夜精品久久久| 欧美国产日韩在线| 欧美日韩在线视频观看| 国产精品美女久久久免费| 国产午夜精品免费一区二区三区| 亚洲天天在线日亚洲洲精| 国产一区二区三区视频在线观看| 欧美日韩另类字幕中文| 国产精品视频一区二区三区四| 欧美一区二区三区免费视|