C#入門介紹及其面向對象思想

C#語言簡介

C#是微軟旗下寫的一種類JAVA的編程語言(面向對象),它是專門爲與Microsoft的.NET Framework 一起使用而設計的,它是一種基於現代面向對象設計方法的語言

C#各類應用程序簡介

Windows Forms(Old):

用於創建Windows桌面應用程序,Windows Forms窗體包含的只是封裝了原生的Windows控件,所以是基於像素圖形的。

WPF(Windows Presentation Foundation):

WPF與Windows Forms一樣用於創建Windows桌面應用程序,但是它是一種基於矢量圖的新技術

ASP.NET Web Forms(Old):

這是ASP.NET的最初形式,僅僅提供web窗體,其目標是按照Windows應用程序開發人員編寫應用程序的方式輕鬆地創建Web應用程序,是不必編寫HTML和JavaScript的。

ASP.NET MVC(Model-View-Controller):

前端頁面HTML和JavaScript的重要性變強,相應地,ASP.NET中出現了新的框架,不只方便編寫了HTML和JavaScript,還基於流行的MVC模式提供了代碼的分離,從而更便於進行單元測試,這個框架就是ASP,NET MVC。

WCF(Windows Communication Foundation):

WCF是一種功能豐富的技術,是一種連接各種系統的強大的新方式,提供了多種通信選項,既可以使用基於REST的通信,也可以使用基於SOAP的通信。

Windows Store Application:

Windows Store應用程序將重點放在內容上,只提供用戶與內容交互所需的任務,而不是提供他們可以使用的不同選項。Windows8的設計就是基於這樣的思路。

C#的類與名稱空間

名稱空間是.NET避免類名衝突的一種方式,相當於java中的packedge一樣,比如在多個packedge中都有bag這個類,此時因爲有不同包名的存在,所以這個bag類就不會存在衝突,C#中的namespace也是這個意思。

類、對象、類成員簡介

類的三大成員:屬性(Property)、方法(Method)、事件(Event)

 

面向對象的C#

C#默認訪問權限

  1. 在namespace中的類、接口默認是internal類型的,也可以顯示的定義爲public類型,不允許是其他訪問類型
  2. 在一個類中,屬性和方法默認是private的,也可以顯示的定義爲public、private、protected、internal、protected internal
  3. 接口中不能定義成員變量,接口中的方法默認爲public的訪問權限
  4. 抽象類中必須有一個以上的抽象方法,抽象方法可以是public、internal、protected。不能是private的訪問類型。

public可以被任意存取

protected只可以被本類和其繼承子類存取

internal只可以被本組合體內所有的類存取

protected internal 只可以被本組合體內所有的類和這些類的繼承子類所存取

private只可以被本類所存取。

繼承:子類可以繼承父類的屬性和方法

重寫:(virtual - override)

多態:當我們用一個父類的變量引用一個子類的實例時,調用一個被重寫的成員時,我們總是能夠調用到被繼承類鏈上的最新的版本

一個結合抽象類和接口以及繼承關係的例子:

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

namespace Helloworld
{
    interface  VehicleBase
    {
        void Stop();
        void run();
    }
    abstract class Vehicle : VehicleBase
    {
        public  void Stop()
        {
            Console.WriteLine("stopped");
        }
        abstract public void run();
    }
    class Car : Vehicle
    {
        public override void run()
        {
            Console.WriteLine("car is running");
        }
    }
    class Truck : Vehicle
    {
        public override void run()
        {
            Console.WriteLine("Truck is running");
        }
    }
}

抽象類接口總結

具體類->抽象類->接口:越來越抽象,內部實現的東西越來越少;

抽象類是未完全實現邏輯的類,抽象類爲複用而生,專門作爲基類來使用,也具有解耦功能

接口是完全未實現邏輯的“類“(”純虛類“,只有函數成員,且成員全部public(隱藏)),接口爲解耦而生,方便單元測試

接口和抽象類都不能實例化,只能用來聲明變量,引用具體類的實例。

 

接口(解耦依賴原則)

接口的解耦特性體現在,當我們構建一個類並且調用它時,如果這個類被調用時內部發生錯誤,那麼此時我們需要去修改這個類,但是根據面向對象的封裝原則,即當我們寫好一個類以後,這個類就要儘可能的避免修改,所以這裏引入接口這個概念,在接口中定義好抽象的類,我們寫好實際的類去實現這個接口,當調用這個類出現錯誤時,我們就不用再去找到這個錯誤類的內部去修改,此時便完成了解耦。

接口隔離原則,接口單一職責原則:接口不可以有太多無關的方法,換句話說,接口必須有功能性,指定職責的功能。需要分離大接口,把本質不同的功能給隔離開。

小例子:

using System;

namespace interfaceExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var driver = new Driver(new lightTank());
            driver.drive();
        }
    }
    class Driver
    {
        private Ivehicle _ivehicle;
        public Driver(Ivehicle ivehicle)
        {
            _ivehicle = ivehicle;
        }
        public void drive()
        {
            _ivehicle.run();
        }
    }
    interface Ivehicle {
        void run();
    }

    class car : Ivehicle
    {
        public void run()
        {
            Console.WriteLine("car is running");
        }
    }
class Truck : Ivehicle
    {
        public void run()
        {
            Console.WriteLine("Truck is running");
        }
    }
    interface Iweapon
    {
        void fire();
    }
    interface itank : Ivehicle, Iweapon
    {

    }
    class lightTank : itank
    {
        public void fire()
        {
            Console.WriteLine("fire...");
        }

        public void run()
        {
            Console.WriteLine("tank is running");
        }
    }
}

上述例子在構建坦克時,因爲坦克擁有fire和run兩個功能,如下兩圖所示,第一張圖是違反了接口單一原則的,而第二張則對其進行了優化,上述代碼爲第二張圖的陳述。

此外當類實現接口時,有一種顯示實現接口的方式,

一般情況下創建warmkiller時,這時是看不到kill方法的,需要自己構建ikiller對象,

IKiller killer = new WarmKiller();

Killer.kill();

如上所示,否則這個kill方法是無法被查看到的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章