virtual:虚方法 使用override进行重写
事件触发 ,事件发布()
事 件
事件发布者:通知某件事件发生的,就是发布者
事件订阅者:对某件事件关注的,就是订阅者
事件行为:触发和注册
事件发生时,会通知所有关注该事件的订阅者---调用订阅者(对象)的注册函数【注册,告诉发布者调用哪一个注册函数】
想在事件发生时被通知,必须注册表示关注
事件订阅:
事件名称+=方法1
事件名称-=方法2 【方法可以是,实例方法,静态方法,匿名方法、Lambada表达式】
运算符
class Program
{
static void Main(string[] args)
{
Pet d = new Dog();
Cat c = new Cat();
Pet p = new Pet();
p.name = "父亲";
d.name = "大黄";
c.name = "咪咪";
p.dw();
d.dw();
c.dw();
}
}
public class Pet
{
public string name;
public void dw()
{
Console.WriteLine("动物名称"+name);
}
};
public class Dog : Pet
{
new public void dw()
{
Console.WriteLine("狗狗名称" + name);
}
};
public class Cat : Pet
{
};
具体调用那个方法根据赋值对象前的引用对象决定。
隐藏方法
这是一堂比较重点的课程,学习后可继续复习
注意public不要漏掉
virtual
override
虚方法和多态
通过new关键字屏蔽基类中的方法,从新定义方法
自然界一切皆对象,易维护,易开发,易扩展
封装,集成,多态
abstract 不能有函数体
如图屏蔽了pet类printname方法
隐藏方法 隐藏基类的方法
namespace projGetMaxScore
{
public class Pet:Object//默认继承Object,可以省略不写
{
public Pet(string name)
{
_name = name;
}
protected string _name;//保护的,派生类才能访问
virtual public void Printname()
{
Console.WriteLine("Pet's name is "+ _name);
}
}
public class Dog:Pet{
public Dog(string name):base(name)//引用基类默认值
{
}
}
public class Cat:Pet {
public Cat(string name):base(name)
{
}
override public void Printname()//隐藏继承方法
{
Console.WriteLine("宠物的名字是 "+ _name);
}
}
class Program
{
static void Main(string[] args)
{
Pet[] pets=new Pet[]{new Dog("jack"),new Cat("tom")};
for(int i=0;i<pets.Length;i++)
pets[i].Printname();
}
}
}
通过指向派生类的基类引用,我们仅仅能访问派生类的基类部分。
Pet cat=new Cat();
cat.PrintName();//调用的是基类中的PrintName方法
但是如果是virtual和override情况下,会先在Pet中看到是虚方法,然后就去派生类中找有没有重写方法,调用重写过的方法
接口
密闭方法
为什么需要密闭
抽象类
调用顺序
ij
设计原则
基类描述了共同的属性和行为;
调用方法是隐藏基类还是原基类方法取决于通过什么类进行引用,用基类调用基类方法,用派生类调用隐藏基类的方法(派生类方法)
结束!
下面的图改为静态static.newdog是委托事件名字。handler是委托类型。
静态变量newdog可以直接被类访问,初始化默认为null,当有订阅者加过来即方法,就会再newdog上加,继而触发事件。
匿名
ok,可以持有多个对象的多个方法。
stack还有一个拓展方法toarray,可以将栈中的元素复制到一个新的元组中。【还有count】
不错
泛型接口
ok