才隔两天,看“控件开发读书笔记”的代码时,又是不知道自己当初讲什么。复习一下后,自己又产生几个简单的问题。
一、方法除了用来重写外,还可以用来调用
以前,不是面对对象编程时,函数或子程序都是用来调用的,没有继承或重写的概念。现在练习了面对对象编程,结果只想到方法是用来继承、重写的,没想到它还可以用来调用。所以,继承就会遇到一个问题,如果子项不知道父项的结构,随意调用,一定会导致死循环。
using System;
class m
{
public static void Main()
{
b b1=new b();
b1.bb();
}
}
class a
{
public virtual void aa()
{
Console.WriteLine("a.aa()");
bb();
}
public virtual void bb()
{
Console.WriteLine("a.bb()");
}
}
class b : a
{
public override void bb()
{
aa();
}
}
虽然传统编程中这样的事情也会发生,但由于代码都在一个程序中,因此比较容易发现,也比较容易避免。但在面向对象编程中,由于父类被封装了,因此子类继承父类时,写的代码好像并没有问题,但事实上却是出错了。
如何看到父类的代码?这里有一个reflector工具,被称为.Net程序员必备的工具之首。
我把以上类a提出来改成DLL的形式,用如下命令编译:
csc /t:library ta.cs
csc t1.cs /r:ta.dll
然后再用reflector工具打开ta.dll,系统清楚地把我的代码体现出来。不错!不错!
二、WebControl的RenderBeginTag方法与writer中的RenderBeginTag方法不是同一个东西。
我们自己写的控件可以重写RenderBeginTag方法,生成多重开始标签,但一般情况下,我们用TagKey来更改控件的Tag。
而writer也有一个RenderBeginTag方法,它是输出类似<DIV>这个东西的,与WebControl的RenderBeginTag无关。