委託 delegate, 繼承

c# 的委託就是說把函式當引數來傳遞。

這個在js完全就用不著搞什麼委託東西,直接轉就是了嘛。對不對!怎麼錄嘛!

 

一個函式,如果它的引數是函式,那麼是這樣子寫的 

public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod)

 Action<string, Int32> voidMethod

的意思是說這個將被傳進來的函式是一個沒有return的函式,就是public void啦, 它需要一個str引數

(這裡提一下,js中每個函式都是return的即使你沒有寫,它也會return undefiend) 

 Func<string, Int32> returnMethod

的意思是說這個函式是一個有return的函式,最後一個引數Int32代表了它的return是一個Int32 , 就是 public Int32啦, 那麼除了最後一個引數其餘的都是這個函式所需要的引數了 

 

具體程式碼 : 

public void test(Func<string,int,string> returnMethod, Action<string> voidMethod)
{
    voidMethod("para1");
    string returnValue = returnMethod("para1", 5);
}
protected void Page_Load(object sender, EventArgs e)
{
    //第一種寫法
    test(delegate(string para1, int para2)
    {
        return "";
    }, delegate(string para1)
    {
        string x = "do somthing";
    });

    //第2中寫法,有點表示式的味道了。 js的話要ECMA6才支援箭頭寫法
    test((para1, para2) => "5", (para1) => { string x = "do somthing"; });
    test((para1, para2) =>
    {
        string a = "5" + para1;
        return a + "5";
    }, (para1) =>
    {
        string x = "do somthing" + para1;
    });
}

 

 

這裡使用的是匿名函式delegate(){},這個比較習慣,因為js大多數會用匿名函式的。

 

當然,如果你硬硬要old school風 , 可以寫比較傳統的 

     public void method(tuoguan voidMethod, tuoguan2 returnMethod) //這裡不可以在寫 Action or Func了
    {
        Int32 i = returnMethod("b");
        voidMethod("b");
    }
    public delegate void tuoguan(string name);
    public delegate Int32 tuoguan2(string name);
    public Int32 returnMethod(string name)
    {
        return 5;
    }

            tuoguan xx = delegate(string name) 
            {
                //do somthing 
            };
            tuoguan2 yy = returnMethod; //這裡可以指向某個方法,不是一定要寫 delegate
            method(xx, yy);

 

委託是很好用的,比如我對進去的匿名函式也可以引用到作用域上的變數,這個和js是一樣的! 

把它當js來寫,我覺得這樣非常好!

 

繼承 

//簡單介紹
public class basic_class_logic
{
    public abstract class chouxiang //抽象類只是一個虛擬的類,是不可以例項化的(其它特性和普通類一樣),目的是給派生類(子類)使用
    { 
        //與介面不同
        //裡面可以寫屬性方法
    }          

    //public:它具有最高的訪問級別,對訪問公共成員沒有限制。
    //private:它的訪問級別最低,僅限於它的包含類。
    //protected:能在它的包含類或包含類的派生類中訪問。
    //internal:只能在同一程序集的文件中。
    //protected internal:僅限於從包含類派生的當前程序集或型別。
    //public abstract:可以在任何地方訪問,但不能例項化,只能繼承。
    //public sealed:可以在任何地方訪問,只能例項化,不能派生。
    public static void move() { } //static void 是靜態方法 (無需例項化類也可以呼叫)
    public const int months = 12; //const 是常量 ,一旦賦值就不能改變,通常用於一些死的變數
    // public const DateTime months = new DateTime(2013, 10, 07, 00, 05, 00, 00); 這裡會報錯 ! const 不能使用 new ,所以用readonly就不會
    public readonly int MAX_VALUE = 10;  // readonly 也是常量 。動態常量 , 有人建議用這個不要用 const
                      

    //公有name "引用" 私有name (和js 一樣邏輯)
    //呼叫:
    //Car first = new Car();
    //first.name = "keatkeat";
    //first.changeName("xinyao");
    //string a = first.name;  //result : xinyao
    //*
    public class Person
    {
        private string _name; //私有name 

        public Person()
        {
            this.name = "ttc";
        }
        public string name //公有name
        {
            get { return _name; } //返回私有name
            set { _name = value; } // set 私有name
        }
        public void changeName(string name)//公有方法 
        {
            _name = name; //替換私有name 
        }
    }
    //無需私有name 的方式 效果和上面一個差不多
    public class Car
    {
        public string name { get; set; } //公有name
        public void changeName(string name)
        {
            this.name = name; //change obj.name 
        }
    }    
}

//繼承
public class xuncheng 
{
    public class Person //基類,父類
    {
        public Person(string name, int age = 0) //例項化是呼叫的函式
        {
            this.name = name;
            this.age = age;
        }
        public string name { get; set; }
        public int age { get; set; }
        public string getName() //普通方法
        {
            return this.name;
        }
        public abstract string getAbstractName(); //abstract 抽象方法(只有在抽象類才能有抽象方法) ,在本類是無法呼叫的,也無內容,只是一個宣告,子類通過覆蓋方法來呼叫(一定要有覆蓋的方法,不然會error)
        public virtual void sayVirtualName() //virtual 虛方法,本類可以呼叫,子類可以覆蓋,如果沒有覆蓋將呼叫此方法 (和普通方法幾乎一樣)
        {
            string a = "bb";
        }           
    }
    //講解:
    //子類可以呼叫所有父類的屬性和方法(除了私有的不可以)           
    public class Student : Person
    {
        //base.屬性 ,base.方法 通過base關鍵字,呼叫父類的函式 (孩子的孩子,通過base方法就會一直向上呼叫,不管幾代都能一直往上)
        public string school_name { get; set; }
        public Student(string school_name) //呼叫基類的建構函式(例項化時的函式)  可以寫default也可以是傳入引數 
            : base(school_name, 5)                 
        {
            this.school_name = school_name;
        }            
          
        public new string getName() //可以用 new 來隱藏父類的普通方法,在父類依然是呼叫父類,在子類就會呼叫new 的方法子類。
        {
            string a = this.name; //如果子類沒有name 屬性會呼叫父類的,有的話會呼叫子類的
            string b = base.name; //100%呼叫父類的name
            return "覆蓋name";
        }
        public override string getAbstractName()//通過 override 來覆蓋抽象方法或虛方法,一但覆蓋了即便是在父類也將呼叫覆蓋了的新方法了!
        {
            return "抽象方法必須實現-用override";
        }
        public override void sayVirtualName()//通過 override 來覆蓋虛方法 (如果子類沒有覆蓋將呼叫回覆類方法)
        {
            string start = "xx"; //這樣就可以達到擴充套件方法的效果了
            base.sayVirtualName();//呼叫回原本的方法
            string end = "xx"; 
        }
    }    
}

//泛型
//呼叫時才把型別傳進去,有點動態的感覺
//呼叫 : Parent<string> xx = new Parent<string>();  這個時候才指定是string 
public class Parent<T> //T 是一個型別 比如 string,int 
{
    public T name { get; set; }
    public T getName()
    {
        return this.name;
    }
}
//struct 是 值型別 
//好處呼叫的是如果引數是值型別可以不用著名 test(100) 而不需要 test<int>(100);
public void test<T>(T number) where T : struct
{
    int z = Convert.ToInt32(number);
    //呼叫 test(100);
}
//不知道好處在哪
public void test2<T>(T lei) where T : class
{

}
//我知道哪個class還需要用泛型嗎?! 不解
public void test3<T>() where T : stooges
{

}
//進來例項化就走?也是不知道哪裡用得上!例項了又不能呼叫它的方法啦!靠
public T test4<T>() where T : new()
{
    T abc = new T();
    return abc;
}
public class stooges
{ 
    
}


protected void Page_Load(object sender, EventArgs e)
{

}

 

更新 2016-07-12 

async 一個方法 

Func<Task<string>> xx = async () =>
{
    await Task.Delay(500);
    return "";
};
string www =  await xx();

 

關鍵詞:public name string 方法 呼叫 int 可以 函式 void return

相關推薦:

一個簡單的多使用者互動系統的實現

Python基礎筆記

day07~基礎資料型別的整理

第二章練習

名片管理系統

Python全棧-day12-day13-函式4

網路程式設計進階:併發程式設計之多執行緒

小白學Python---第二週小結(字串和常用資料結構)

微信小程式如何實現自動退款功能?

可快速生成增刪curd改查功能的外掛