C#学习基础概念二十五问续2第1/2页

时间:2021-05-20

6.sealed修饰符是干什么的?
答:
sealed修饰符表示密封
用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥
用于方法和属性时,表示该方法或属性不能再被继承,必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员
通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱
恰当的利用sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample06
{
classProgram
{
classA
{
publicvirtualvoidF()
{
Console.WriteLine("A.F");
}
publicvirtualvoidG()
{
Console.WriteLine("A.G");
}
}
classB:A
{
publicsealedoverridevoidF()
{
Console.WriteLine("B.F");
}
publicoverridevoidG()
{
Console.WriteLine("B.G");
}
}
classC:B
{
publicoverridevoidG()
{
Console.WriteLine("C.G");
}
}
staticvoidMain(string[]args)
{
newA().F();
newA().G();
newB().F();
newB().G();
newC().F();
newC().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表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample07
{
classProgram
{
classBaseClass
{
publicvirtualvoidF()
{
Console.WriteLine("BaseClass.F");
}
}
classDeriveClass:BaseClass
{
publicoverridevoidF()
{
base.F();
Console.WriteLine("DeriveClass.F");
}
publicvoidAdd(intLeft,intRight)
{
Console.WriteLine("AddforInt:{0}",Left+Right);
}
publicvoidAdd(doubleLeft,doubleRight)
{
Console.WriteLine("Addforint:{0}",Left+Right);
}
}
staticvoidMain(string[]args)
{
DeriveClasstmpObj=newDeriveClass();
tmpObj.F();
tmpObj.Add(1,2);
tmpObj.Add(1.1,2.2);
Console.ReadLine();
}
}
}
结果:
BaseClass.F
DeriveClass.F
AddforInt:3
Addforint:3.3

8.什么是索引指示器?
答:
实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int
简单来说,其本质就是一个含参数属性
示例:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample08
{
publicclassPoint
{
privatedoublex,y;
publicPoint(doubleX,doubleY)
{
x=X;
y=Y;
}
//重写ToString方法方便输出
publicoverridestringToString()
{
returnString.Format("X:{0},Y:{1}",x,y);
}
}
publicclassPoints
{
Point[]points;
publicPoints(Point[]Points)
{
points=Points;
}
publicintPointNumber
{
get
{
returnpoints.Length;
}
}
//实现索引访问器
publicPointthis[intIndex]
{
get
{
returnpoints[Index];
}
}
}
//感谢watsonhua(http://huazhihao.cnblogs.com/)的指点
//索引指示器的实质是含参属性,参数并不只限于int
classWeatherOfWeek
{
publicstringthis[intIndex]
{
get
{
//注意case段使用return直接返回所以不需要break
switch(Index)
{
case0:
{
return"Todayiscloudy!";
}
case5:
{
return"Todayisthundershower!";
}
default:
{
return"Todayisfine!";
}
}
}
}
publicstringthis[stringDay]
{
get
{
stringTodayWeather=null;
//switch的标准写法
switch(Day)
{
case"Sunday":
{
TodayWeather="Todayiscloudy!";
break;
}
case"Friday":
{
TodayWeather="Todayisthundershower!";
break;
}
default:
{
TodayWeather="Todayisfine!";
break;
}
}
returnTodayWeather;
}
}
}
classProgram
{
staticvoidMain(string[]args)
{
Point[]tmpPoints=newPoint[10];
for(inti=0;i<tmpPoints.Length;i++)
{
tmpPoints[i]=newPoint(i,Math.Sin(i));
}
PointstmpObj=newPoints(tmpPoints);
for(inti=0;i<tmpObj.PointNumber;i++)
{
Console.WriteLine(tmpObj[i]);
}

string[]Week=newstring[]{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Staurday"};
WeatherOfWeektmpWeatherOfWeek=newWeatherOfWeek();
for(inti=0;i<6;i++)
{
Console.WriteLine(tmpWeatherOfWeek[i]);
}
foreach(stringtmpDayinWeek)
{
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
Todayiscloudy!
Todayisfine!
Todayisfine!
Todayisfine!
Todayisfine!
Todayisthundershower!
Todayiscloudy!
Todayisfine!
Todayisfine!
Todayisfine!
Todayisfine!
Todayisthundershower!
Todayisfine!
12下一页阅读全文

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章