zoukankan      html  css  js  c++  java
  • 委托的使用 举例猫叫,老鼠逃跑,主人惊醒

      this:指当前类,this调用当前类的属性,方法,包括构造函数的方法,继承本类的构造函数。

    base:指当前类的父类,可调用父类的非私有属性,方法,继承父类的构造函数括号里的参数

     一:this 的用处

        1:限定被相识的名称隐藏的成员,方法或函数(多用在构造函数中)

        

     class Person
    {
      pricate string name;
      public Person(string name)
     {
       this.name= name;
      }
    }

    由于this.name 中的name和入参name的名称一样,即被入参隐藏了,所以要用this 限定name是本类的属性

     2:将自己this对象作为参数传递给其他方法

    1 class Teacher  
    2 {  
    3     public void tshow()  
    4     {  
    5         Console.WriteLine("我是老师!");  
    6         Console.WriteLine(this);//显示的是本类的类名  
    7     }  
    8 }  

    3:声明索引器

    1 private int _index;  
    2  public int this[int index]  
    3  {  
    4      get { return _index; }  
    5      set { _index = index; }  
    6  }  

    二:base的用处(base实现了多态)

    1.在子类中通过base调用父类的构造函数,即在子类初始化时和父类进行通信

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Person p = new Person("小李");
     6             p.show();
     7             Teacher t = new Teacher("小刘",18);
     8             t.tshow();
     9            
    10             Console.Read();
    11         }
    12     }
    13     class Person
    14     {
    15         protected string name;
    16         public Person(string name)
    17         {
    18             this.name = name;
    19         }
    20         public void show()
    21         {
    22             Console.WriteLine("我属于人类!");
    23         }
    24     }
    25     class Teacher:Person
    26     {
    27         
    28         public Teacher(string name,int age)
    29             : base(name)
    30         {
    31             this.Age = age;
    32         }
    33         private int _age;
    34         public int Age
    35         {
    36             get { return _age; }   //
    37             set { _age = value; }  //
    38         }
    39         public void tshow()
    40         {
    41             Console.WriteLine("我是学生{0}{1}!",name,Age);        
    42         }      
    43     }

    2.调用基类上已被其它方法重写的方法

        class Program
        {
            static void Main(string[] args)
            {
                Person p = new Person();
                p.show();
                Teacher t = new Teacher();
                t.show();
                Console.Read();
            }
        }
        class Person
        {
            public virtual void show()
            {
                Console.WriteLine("我属于人类");
            }
        }
        class Teacher:Person
        {
            public override void show()
            {
                base.show();
                Console.WriteLine("我是老师");
            }
        }

    3.调用基类的构造函数

        class Program
        {
            static void Main(string[] args)
            {
                Person p = new Person();
                p.show();
                Teacher t = new Teacher();
                t.tshow();
                Console.Read();
            }
        }
        
        class Person
        {
            public void show()
            {
                Console.WriteLine("我属于人类");
            }
        }
        class Teacher:Person
        {
            public void tshow()
            {
                base.show();
                Console.WriteLine("我是老师");
            }
        }

    在多层继承中:

    1>有重载,base指向直接继承的父类

    2>无重载,base可指向任意上级父类

     总结

           不能在静态方法中引用this和base,因为当类第一次被加载的时候,静态成员已经被加载到静态存储区,此时类的对象还有可能没有创建,而this和base访问的都是类的实例,也就是对象,而静态成员只能由类访问,不能由对象访问,所以静态方法中不能调用类成员字段

    猫叫,老鼠逃跑,主人惊醒的实现方式

    public delegate void SubEventHandler();
         public abstract class Subject
         {
             public event SubEventHandler SubEvent;
             protected void FireAway()
             {
                 if (this.SubEvent != null)
                     this.SubEvent();
             }   
         }
         public class Cat : Subject
         {  
             public void Cry()
             {
                 Console.WriteLine("cat cryed.");
                 this.FireAway();
             }
         }
         public abstract class Observer
         {
             public Observer(Subject sub)
             {
                 sub.SubEvent += new SubEventHandler(Response);
             }
             public abstract void Response();    
         }
         public class Mouse : Observer
         {
             private string name;
             public Mouse(string name, Subject sub) : base(sub)
             {   
                 this.name = name;
             }
             public override void Response()
             {
                 Console.WriteLine(name + " attempt to escape!");
             }
         }
         public class Master : Observer
         {
             public Master(Subject sub) : base(sub){}
             public override void Response()
             {
                 Console.WriteLine("host waken");
             }
         }
         class Program
         {
             static void Main(string[] args)
             {
                 Cat cat = new Cat();
                 Mouse mouse1 = new Mouse("mouse1", cat);
                 Mouse mouse2 = new Mouse("mouse2", cat);
                 Master master = new Master(cat);
                 cat.Cry();
             }
     
         }
    public interface Observer
         {
             void Response();    //观察者的响应,如是老鼠见到猫的反映
         }
         public interface Subject
         {
             void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
         }
         public class Mouse : Observer
         {public Mouse(Subject subj)
             {           
                 subj.AimAt(this);
             }
             
             public void Response()
             {
                 Console.WriteLine(name + " 老鼠开始逃跑了!");
             }
         }
         public class Master : Observer
         {   
             public Master(Subject subj)
             {           
                 subj.AimAt(this);
             }
             
             public void Response()
             {
                 Console.WriteLine("主人被惊醒!");
             }  
         }
      
         public class Cat : Subject
         {
             private ArrayList observers;
             public Cat()
             {   
                 this.observers = new ArrayList();
             }
             public void AimAt(Observer obs)
             {
                 this.observers.Add(obs);
             }
             public void Cry()
             {
                 Console.WriteLine("猫叫了!");
                 foreach (Observer obs in this.observers)
                 {
                     obs.Response();
                 }
             }
         }
         class Program
         {       
             static void Main(string[] args)
             {
                 Cat cat = new Cat();
                 Mouse mouse1 = new Mouse("mouse1", cat);
                 Mouse mouse2 = new Mouse("mouse2", cat);
                 Master master = new Master(cat);
                 cat.Cry();
             }
         }
     1 [csharp] view plain copy
     2 class Program  
     3 {  
     4     static void Main(string[] args)  
     5     {  
     6         Person p = new Person("小李");  
     7         p.show();  
     8         Teacher t = new Teacher("小刘",18);  
     9         t.tshow();  
    10          
    11         Console.Read();  
    12     }  
    13 }  
    14 class Person  
    15 {  
    16     protected string name;  
    17     public Person(string name)  
    18     {  
    19         this.name = name;  
    20     }  
    21     public void show()  
    22     {  
    23         Console.WriteLine("我属于人类!");  
    24     }  
    25 }  
    26 class Teacher:Person  
    27 {  
    28       
    29     public Teacher(string name,int age)  
    30         : base(name)  
    31     {  
    32         this.Age = age;  
    33     }  
    34     private int _age;  
    35     public int Age  
    36     {  
    37         get { return _age; }   //
    38         set { _age = value; }  //
    39     }  
    40     public void tshow()  
    41     {  
    42         Console.WriteLine("我是学生{0}{1}!",name,Age);          
    43     }        
    44 }  
    111111
  • 相关阅读:
    浏览器阻止window.open的解决方案
    汇总前端最最常用的JS代码片段
    检测是否是微信浏览器
    添加标签
    如何去掉textarea右下角的灰色角标?
    移动WEB前端开发资源整合
    图片文字水平居中(移动端)
    文本形式访客计数器
    如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)
    深拷贝,浅拷贝
  • 原文地址:https://www.cnblogs.com/whl4835349/p/9235112.html
Copyright © 2011-2022 走看看