11.可以使用抽象函数重写基类中的虚函数吗?
答:
可以
需使用new修饰符显式声明,表示隐藏了基类中该函数的实现
或增加override修饰符,表示抽象重写了基类中该函数的实现
示例:
classBaseClass
{
publicvirtualvoidF()
{
Console.WriteLine("BaseClass.F");
}
}
abstractclassDeriveClass1:BaseClass
{
publicabstractnewvoidF();
}
//感谢watsonhua(http://huazhihao.cnblogs.com/)的指点
//是他提醒了我还可以用这种方法抽象重写基类的虚方法
abstractclassDeriveClass2:BaseClass
{
publicabstractoverridevoidF();
}
12.密封类可以有虚函数吗?
答:
可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数
示例:
classBaseClass
{
publicvirtualvoidF()
{
Console.WriteLine("BaseClass.F");
}
}
sealedclassDeriveClass:BaseClass
{
//基类中的虚函数F被隐式的转化为非虚函数
//密封类中不能再声明新的虚函数G
//publicvirtualvoidG()
//{
//Console.WriteLine("DeriveClass.G");
//}
}
13.什么是属性访问器?
答:
属性访问器(PropertyAccessor),包括get访问器和set访问器分别用于字段的读写操作
其设计目的主要是为了实现面向对象(OO)中的封装思想。根据该思想,字段最好设为private,一个精巧的类最好不要直接把字段设为公有提供给客户调用端直接访问
另外要注意属性本身并不一定和字段相联系
14.abstract可以和virtual一起使用吗?可以和override一起使用吗?
答:
abstract修饰符不可以和static、virtual修饰符一起使用
abstract修饰符可以和override一起使用,参见第11点
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample14
{
classBaseClass
{
publicvirtualvoidF()
{
Console.WriteLine("BaseClass.F");
}
}
abstractclassDeriveClass1:BaseClass
{
//在这里,abstract是可以和override一起使用的
publicabstractoverridevoidF();
}
classProgram
{
staticvoidMain(string[]args)
{
}
}
}
15.接口可以包含哪些成员?
答:
接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员