由於類 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);
for (int i = 0; i < tmpObj.PointNumber; i++)
{
Console.WriteLine(tmpObj[i]);
}
string[] Week = new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Staurday"};
WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek();
for (int i = 0; i < 6; i++)
{
Console.WriteLine(tmpWeatherOfWeek[i]);
}
foreach (string tmpDay in Week)
{
Console.WriteLine(tmpWeatherOfWeek[tmpDay]);
}
Console.ReadLine();
}
}
}
結果:
X: 0 , Y: 0
X: 1 , Y: 0.841470984807897
X: 2 , Y: 0.909297426825682
X: 3 , Y: 0.141120008059867
X: 4 , Y: -0.756802495307928
X: 5 , Y: -0.958924274663138
X: 6 , Y: -0.279415498198926
X: 7 , Y: 0.656986598718789
X: 8 , Y: 0.989358246623382
X: 9 , Y: 0.412118485241757
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is fine!