国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

委托delegate,繼承

2019-11-14 16:31:24
字體:
來源:轉載
供稿:網(wǎng)友

c# 的委托就是說把函數(shù)當參數(shù)來傳遞。

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

 

一個函數(shù),如果它的參數(shù)是函數(shù),那么是這樣子寫的 

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

 Action<string, Int32> voidMethod

的意思是說這個將被傳進來的函數(shù)是一個沒有return的函數(shù),就是public void啦, 它需要一個str參數(shù)

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

 Func<string, Int32> returnMethod

的意思是說這個函數(shù)是一個有return的函數(shù),最后一個參數(shù)Int32代表了它的return是一個Int32 , 就是 public Int32啦, 那么除了最后一個參數(shù)其余的都是這個函數(shù)所需要的參數(shù)了 

 

具體代碼 : 

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;    });}

 

 

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

 

當然,如果你硬硬要old school風 , 可以寫比較傳統(tǒng)的 

     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);

 

委托是很好用的,比如我對進去的匿名函數(shù)也可以引用到作用域上的變量,這個和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 是靜態(tài)方法 (無需實例化類也可以調(diào)用)    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 也是常量 。動態(tài)常量 , 有人建議用這個不要用 const                          //公有name "引用" 私有name (和js 一樣邏輯)    //調(diào)用:    //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) //實例化是調(diào)用的函數(shù)        {            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 抽象方法(只有在抽象類才能有抽象方法) ,在本類是無法調(diào)用的,也無內(nèi)容,只是一個聲明,子類通過覆蓋方法來調(diào)用(一定要有覆蓋的方法,不然會error)        public virtual void sayVirtualName() //virtual 虛方法,本類可以調(diào)用,子類可以覆蓋,如果沒有覆蓋將調(diào)用此方法 (和普通方法幾乎一樣)        {            string a = "bb";        }               }    //講解:    //子類可以調(diào)用所有父類的屬性和方法(除了私有的不可以)               public class Student : Person    {        //base.屬性 ,base.方法 通過base關鍵字,調(diào)用父類的函數(shù) (孩子的孩子,通過base方法就會一直向上調(diào)用,不管幾代都能一直往上)        public string school_name { get; set; }        public Student(string school_name) //調(diào)用基類的構造函數(shù)(實例化時的函數(shù))  可以寫default也可以是傳入?yún)?shù)             : base(school_name, 5)                         {            this.school_name = school_name;        }                              public new string getName() //可以用 new 來隱藏父類的普通方法,在父類依然是調(diào)用父類,在子類就會調(diào)用new 的方法子類。        {            string a = this.name; //如果子類沒有name 屬性會調(diào)用父類的,有的話會調(diào)用子類的            string b = base.name; //100%調(diào)用父類的name            return "覆蓋name";        }        public override string getAbstractName()//通過 override 來覆蓋抽象方法或虛方法,一但覆蓋了即便是在父類也將調(diào)用覆蓋了的新方法了!        {            return "抽象方法必須實現(xiàn)-用override";        }        public override void sayVirtualName()//通過 override 來覆蓋虛方法 (如果子類沒有覆蓋將調(diào)用回復類方法)        {            string start = "xx"; //這樣就可以達到擴展方法的效果了            base.sayVirtualName();//調(diào)用回原本的方法            string end = "xx";         }    }    }//泛型//調(diào)用時才把類型傳進去,有點動態(tài)的感覺//調(diào)用 : 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 是 值類型 //好處調(diào)用的是如果參數(shù)是值類型可以不用著名 test(100) 而不需要 test<int>(100);public void test<T>(T number) where T : struct{    int z = Convert.ToInt32(number);    //調(diào)用 test(100);}//不知道好處在哪public void test2<T>(T lei) where T : class{}//我知道哪個class還需要用泛型嗎?! 不解public void test3<T>() where T : stooges{}//進來實例化就走?也是不知道哪里用得上!實例了又不能調(diào)用它的方法啦!靠public T test4<T>() where T : new(){    T abc = new T();    return abc;}public class stooges{     }protected void Page_Load(object sender, EventArgs e){}

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泗洪县| 石楼县| 龙游县| 太仆寺旗| 吉木萨尔县| 拉萨市| 平度市| 新疆| 大冶市| 松江区| 河源市| 全州县| 广饶县| 清苑县| 团风县| 定远县| 大厂| 湟中县| 舞钢市| 宁晋县| 红河县| 土默特右旗| 玉屏| 肇州县| 耒阳市| 揭东县| 四川省| 额尔古纳市| 郧西县| 枞阳县| 凤台县| 抚顺县| 崇左市| 嵊州市| 通榆县| 临澧县| 昭觉县| 大宁县| 祁门县| 固阳县| 凤山市|