public class Listbox: Control
上面的statement表示Listbox类继承自Control类.
C#中没有私有或者保护继承,而且C#中类不能从多个基类继承, 但是可以重多个接口继承(还不知道啥意思,等后面看)
怎么实现方法(method)的多态呢?
要创建支持多态性的方法,只需在基类中将其标记为virtual. 如: public virtual void DrawWindow(), 这样,每个派生类都可以自由实现自己版本的DrawWindow()方法了, 为实现此功能,在派生类方法定义中用关键字 override 来覆盖基类的虚方法,然后添加自己的代码..
派生类中调用基类的构造函数的写法:
string contents) :
base(top, left) // call base constructor
{
listBoxContents = contents;
}
要注意的是在派生类中重新定义的函数必须用关键字override标记,这点与C++是不一样的.
关于派生类的构造函数: 如果基类有可以访问的默认构造函数,派生类的构造方法就不需要显式调用基类构造方法,默认构造方法将被隐式调用.
但是,如果基类没有默认构造方法,也就是说基类中自己定义了构造方法,那么派生类中的构造方法必须使用base关键字显式调用基类的构造方法.
基类和派生类中出现同名的虚函数的情况:
如果直接不加任何限制,编译时编译器会提示,派生类的虚函数覆盖了基类的虚函数,如果确实这是你的真实意图,在派生类的函数前加上override 关键字:
public class ListBox:Control
{
public override void sort(){。。。}
}
如果不想重载虚函数,则应该加上new关键字:
public class ListBox:Control
{
public new virtual void sort(){。。。}
}
抽象类与密封类
如果类的一个或者多个方法是抽象的,那么这个类就是抽象类。
抽象方法要求所有派生方法必须实现这个方法,但是它不能强制要求派生类的派生类实现该方法。
抽象类并不仅仅是一种实现技巧,更是一种抽象的思想,抽象类中描述了实现这种抽象的所有类的共有的方法。
抽象类不能有实例,也就是他必须被继承使用,而密封类则刚好与之相反,密封类完全不允许被派生。关键字sealed用于标示密封类。
所有类的根类:Object类
所有C#类,无论是什么类型,都可以看成是从Systm.Object继承而来,甚至值类型也包括其中。
object类的一些方法:
方法 | 作用 |
Equals() | 比较两个对象是否相等 |
GetHashCode() | 为对象提供用于集合中的散列码 |
GetType() | 提供对类型对象的访问 |
ToString() | 提供对象的字符串表示 |
Finalize() | 清楚无用内存资源,用析构函数实现 |
MemberwiseClone() | 创建对象的副本,自定义类型不应实现 |
ReferenceEquals() | 比较两个函数是否指向相同实例 |
嵌套类
类的成员是另外的类是允许的,被包含的内部类称为嵌套类(nested class),而包含嵌套类的类则称为外层类(outer class)。
嵌套类可以访问外层类的所有成员,包括私有成员。
要声明嵌套类的实例时,必须指定外层类的类型名。