}
public virtual void G() {
Console.WriteLine("A.G"); } }
class B : A {
public sealed override void F() {
Console.WriteLine("B.F"); }
public override void G() {
Console.WriteLine("B.G"); } }
class C : B {
public override void G() {
Console.WriteLine("C.G"); } }
static void Main(string[] args) {
new A().F(); new A().G(); new B().F(); new B().G(); new C().F(); new C().G(); Console.ReadLine(); } } } 结果:
类 B 在继承类 A 时可以重写两个虚函数,如图所示:
由于类 B 中对 F 方法进行了密封, 类 C 在继承类 B 时只能重写一个函数,如图所示:
控制台输出结果,类 C 的方法 F 只能是输出 类B 中对该方法的实现:
A.F A.G B.F B.G B.F C.G
7.override 和 overload 的区别? 答:
override 表示重写,用于继承类对基类中虚成员的实现
overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现 示例:
using System;
using System.Collections.Generic; using System.Text; namespace Example07 {
class Program {
class BaseClass {
public virtual void F() {
Console.WriteLine("BaseClass.F"); } }
class DeriveClass : BaseClass {
public override void F() {
base.F();
Console.WriteLine("DeriveClass.F"); }
public void Add(int Left, int Right) {
Console.WriteLine("Add for Int: {0}", Left + Right); }
public void Add(double Left, double Right) {
Console.WriteLine("Add for int: {0}", Left + Right); } }
static void Main(string[] args)
{
DeriveClass tmpObj = new DeriveClass(); tmpObj.F(); tmpObj.Add(1, 2); tmpObj.Add(1.1, 2.2); Console.ReadLine(); } } } 结果: BaseClass.F DeriveClass.F Add for Int: 3 Add for int: 3.3
8.什么是索引指示器? 答:
实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int
简单来说,其本质就是一个含参数属性 示例:
using System;
using System.Collections.Generic; using System.Text; namespace Example08 {
public class Point {
private double x, y;
public Point(double X, double Y) {
x = X; y = Y; }
//重写ToString方法方便输出 public override string ToString() {
return String.Format("X: {0} , Y: {1}", x, y); } }
public class Points {
Point[] points;
public Points(Point[] Points) {
points = Points; }
public int PointNumber { get {
return points.Length; } }
//实现索引访问器
public Point this[int Index] { get {
return points[Index]; } } }
//感谢watson hua(http://huazhihao.cnblogs.com/)的指点 //索引指示器的实质是含参属性,参数并不只限于int class WeatherOfWeek {
public string this[int Index] { get {
//注意case段使用return直接返回所以不需要break switch (Index) {
case 0: {
return "Today is cloudy!"; } case 5: {
return "Today is thundershower!"; } default:
{
return "Today is fine!"; } } } }
public string this[string Day] { get {
string TodayWeather = null; //switch的标准写法 switch (Day) {
case "Sunday": {
TodayWeather = "Today is cloudy!"; break; }
case "Friday": {
TodayWeather = "Today is thundershower!"; break; } default: {
TodayWeather = "Today is fine!"; break; } }
return TodayWeather; } } }
class Program {
static void Main(string[] args) {
Point[] tmpPoints = new Point[10]; for (int i = 0; i < tmpPoints.Length; i++) {
tmpPoints[i] = new Point(i, Math.Sin(i)); }
Points tmpObj = new Points(tmpPoints);