Unity技術(shù)博客 - C#語言那點事(接口&依賴倒置)

Unity版本: 5.2

使用語言: C#


寫在前面

  搞計算機這個行業(yè)的,語言功底的重要性不言而喻。
  熟悉CSharp語言的都知道,我們寫代碼設(shè)計程序的時候要想著幾條原則:  
      1.單一職責(zé)
      2.里氏替換
      3.依賴倒置
      4.接口隔離
      5.開放封閉
      6.迪米特法則
  今天我想通過實例來講一下 #依賴倒置原則#

依賴倒置原則

What 什么是依賴倒置原則?

記住一句話:抽象不應(yīng)該依賴細節(jié),細節(jié)需要依賴抽象。

Where 舉例:

1.司機會開車,那么它可以開奔馳車也可以開寶馬車 。這里開車就是抽象,而開奔馳還是開寶馬就是細節(jié)。
2.魔獸世界中的英雄可以學(xué)習(xí)騎術(shù)技能,學(xué)完了就以可以騎馬,騎摩托車……這里騎術(shù)就是抽象,騎摩托還是騎馬就是細節(jié)。

How 上面的例子怎么實現(xiàn)

using UnityEngine;
using System.Collections;
/// <summary>
/// Icar.聲明接口,所有的車都要實現(xiàn)該接口
/// </summary>
public interface ICar
{
    void Run();
}
/// <summary>
/// Bentley.賓利車類
/// </summary>
public class Bentley : ICar
{
    public void Run()
    {
        Debug.Log("Bentley Run....");
    }
}
/// <summary>
/// Bentley.法拉利車類
/// </summary>
public class Ferrari : ICar
{
    public void Run ()
    {
        Debug.Log("Ferrari Run....");
    }
}
/// <summary>
/// Driver.司機類
/// </summary>
public class Driver {   
    //司機可以開車(依賴倒置寫法)
   #//參數(shù)里面并沒有寫細節(jié):賓利還是法拉利
    public void Drive(ICar car)
    {
        car.Run();
    }
}

Why 為什么要使用這個原則?

它可以讓你的程序減少類之間的耦合, 提高系統(tǒng)的穩(wěn)定性,降低并行開發(fā)倒置的風(fēng)險,最重要的是提高代碼的可讀性和可維護性。


練習(xí)

在數(shù)據(jù)庫創(chuàng)建MonsterData表,具有字段:怪物ID,怪物等級,怪物攻擊力, 怪物血量。
在數(shù)據(jù)庫創(chuàng)建HeroData表,具有字段:英雄ID, 英雄等級,英雄血量。
創(chuàng)建客戶端腳本,創(chuàng)建對應(yīng)的表結(jié)構(gòu),并創(chuàng)建數(shù)據(jù)解析類,實現(xiàn)統(tǒng)一的數(shù)據(jù)解析方法。(提示:用依賴倒置原則封裝統(tǒng)一方法,實現(xiàn)數(shù)據(jù)的解析)

答案(思考之后再看)

using UnityEngine;
using System;
using System.Collections;

/// <summary>
/// Idata. 所有的結(jié)構(gòu)體要有這個方法,用來解析數(shù)據(jù)
/// </summary>
public interface IData
{
    void Parse(string[] datas);
}
/// <summary>
/// Monster data.怪物結(jié)構(gòu)體
/// </summary>
public struct MonsterData : IData
{
    public int mID;         //怪物ID  
    public int mRank;       //怪物等級
    public int mAttack;     //怪物攻擊力
    public int mHP;         //怪物血量

    public void Parse (string[] datas)
    {
        int index = 0;
        this.mID = Convert.ToInt32(datas[index++]);
        this.mRank = Convert.ToInt32(datas[index++]);
        this.mAttack = Convert.ToInt32(datas[index++]);
        this.mHP = Convert.ToInt32(datas[index++]);
    }
}
/// <summary>
/// Monster data.英雄結(jié)構(gòu)體
/// </summary>
public struct HeroData : IData
{
    public int mID;     //英雄ID
    public int mRank;   //英雄等級
    public int mHP;     //英雄血量
    public void Parse (string[] datas)
    {
        int index = 0;
        this.mID = Convert.ToInt32(datas[index++]);
        this.mRank = Convert.ToInt32(datas[index++]);
        this.mHP = Convert.ToInt32(datas[index++]);
    }
}
/// <summary>
/// XML2Data.此類用來將XML數(shù)據(jù)轉(zhuǎn)換成結(jié)構(gòu)體
/// </summary>
public class XML2Data
{
    //采用依賴倒置原則 + 泛型約束
    //泛型約束:T類型必須實現(xiàn)了接口IData,并且有構(gòu)造方法
    public static T GetData<T>(string[] datas) where T : IData, new()
    {
        T result = new T();
        result.Parse(datas);
        return result;
    }
}

寫在最后

 #其他原則連載中。。。
 #成功的道路沒有捷徑,代碼這條路更是如此,唯有敲才是王道。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容