VS派生类
- 继承。派生类
class AClass : FClass
构建函数继承 public classname (string astring): base(astring){};默认不继承基类的构建函数。基类的在前面执行,然后执行派生类构建函数中的代码。
- 多态性
http://www.cnblogs.com/zhangkai2237/archive/2012/12/20/2826734.html
即看对象变量引用的是哪个类的实例,优先用对应类的方法,如果没有,到基类找。
一说同名操作,有多种,包含重载、重写、隐藏方法等
重写即派生类重写基类方法
基类定义允许重写
public virtual viod methodname(){}
派生类重写
public override viod methodname(){}
方法名必须相同;参数列表必须相同;相同的返回值;存取权限相同
- 隐藏基类成员
用于版本,用new定义
隐藏域
基类 public string astring;
派生类public new string astring;
隐藏方法
参数必须相同。
基类public classname(string:astring);
派生类public new classsname(string:astring);
(1)隐藏方法不但可以隐藏基类中的虚方法,而且也可以隐藏基类中的非虚方法。
(2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法。
(3)和上一条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果引用的是父类的实例那么调用基类的方法,如果引用的是派生类的实例则调用派生类的方法。
- 区别隐藏和重写
http://www.cnblogs.com/Grisson/archive/2005/09/01/227467.html
“重写”:允许使用现有成员的一个新实现代替基础类实现。换句话说就是允许使用自己的实现代替相
同名称的一个基类成员。
“隐藏”:可以模糊一个基类的成员并用一个完全不同的新实现代替它。
“重写”:在基类中要被重写的方法要修饰为virtual,在子类中该方法要被修饰为overrride。
新实现的方法必须与要被重写的方法有相同的函数名,函数签名,返回类型以及
访问级别。(简单来说就是除了virtual/override,其他函数声明完全一致)
“隐藏”:子类中的方法要被修饰为new
子类中的方法与要被隐藏的方法有相同的函数签名并且是相同种类的成
员,但是它可以拥有不同的访问级别,返回类型以及函数实现 。
“重载”:一个重载的方法必须拥有于先前存在的方法有相同函数名字,而且必须拥有不同
的函数签名,至于返回类型和访问级别可以相同也可以不同
任何拥有于先前存在的方法相同的函数名,不同色调签名方法,都将被看做是那个方法的一个重载并且不会隐藏先前存在的方法
如果一个继承类被强制转换为的他的一个基类并且一个重写的方法被调用:
if 新的方法是重写的,则对象的类型决定那个方法被调用,而不是变量。
这种情况下继承类的方法被调用
if 新的方法是隐藏的,则变量的类型决定那个方法被调用,而不是对象。
这种情况下基类的方法被调用
- 抽象方法
在基类中定义的并且必须在派生类中重写的方法,
在基类使用abstract关键字定义
在派生类使用overide关键字定义
- 版本
定义了基类虚方法后,子类定义同名方法,但没写new或override,会出现编译错误,所以子类要定义关键字。
- System.Object类
所有类都隐含从这个类派生。
比较有用的方法有。ToString(),返回一个与对象的类名相等的字符串,mycar.ToString()等于类名Car;静态方法Equals(object,object),Car.Equals(mycar,myothercar),对比两个对象是否相等;静态方法ReferenceEquals(object,object),对比两个对象引用是否引用同一个对象,Car.ReferenceEquals(mycar,myothercar);GetType()返回对象的类,或返回变量的类型,mycar.gettype()返回类名;Finalize(),允许对象在垃圾收集器从内存删除对象之前进行清除工作;MemberwiseClone,创建对象的拷贝,mycar.MemberwiseClone返回拷贝对象。
比如,可在类中重写虚方法ToString,实现返回一个域值
- 重载System.Object类方法
因为都是从System.Object类继承,所以可重载System.Object类的虚方法virtual
- 包装和解包
包装:把变量隐式包装成一个system.object对象,简写成object
解包:把变量包装的object对象,解包成变量。
int myint =10;
可显示写成
int myint =10;
object myobject = myint;这里是包装
int myint2 = (int)myobject;这里是解包
因为有隐含的包装和解包,可以像使用对象一样使用变量,如myint.tostring(),如myint.gettype()。
- 抽象类和抽象方法
抽象类用abstract,代表概念,可派生出代表实际的类
抽象方法也是abstract,在派生类中,这个方法必须被重写,并必须包含代码。
特点,不能创建抽象类的对象;不能标记构建函数为抽象的;可以用抽象类派生另一个类(包括抽象类);必须在派生类用代码重写基类的抽象方法。
- 密封类和方法sealed
密封类和密封方法限制继承和多态。即不能继承密封类,不能重载重写密封方法。在public等前加sealed
- 强制转换对象
基类和派生类之间可互相转换,可跨级转换,只要其中一个类是另一个类的基类或更上级基类。
转换后的效果是,只能存取转换后的类的成员了。
向上转换,转换成基类fatherclass myfatherclass = (fatherclass) mychildclass;
向下转换,转换成派生类 childclass mychildclass = (childclass )myfatherclass;
- 存取访问限制
- 重载运算符
重写算术运算、比较值等。
比如==,当比较对象时,其实比较的是对象变量的引用,如果想比较对象的实例域,就不能用默认的静态的==了,可以用重写默认的静态的==,如果重写了==和Equals,就必须重写!=,即重写了一个运算符,就必须重写与其相对的运算符,如==和!=,<和>。
public static bool operator == (class1 myclass1,class2 myotherclass1){}
比如+,当比较对象时,会编译报错,因不能简单的加两个对象,可以重写+,实现加对象的实例域的值。
public static class1 opertator +(class1 myclass1,class2 myotherclass1){}