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 }