委托的使用 举例猫叫,老鼠逃跑,主人惊醒

  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 }  

 

posted @ 2018-06-27 17:32  wonderfulviews  阅读(306)  评论(0编辑  收藏  举报