当前位置:编程学习 > C#/ASP.NET >>

对虚拟的看法

答案:★首先说说用词约定,虽然各位可能不接受我的用词,但为了避免书上般的很长的话,别无选择:
类型<=>类型的概念比类广泛
成员函数<=>包括方法、属性器和索引器
【{ }】<=>函数体部分,指实现的代码,即{........},例如abstract成员函数和接口成员是没有{ }的
【先代】<=>基类型
【后代】<=>派生类型
【本代】<=>本类型
【签名】<=>同一类型中成员的签名是唯一的
【同签名】<=>不同代的成员但签名相同的
【先员】<=>同签名的【先代中定义】成员
【后员】<=>同签名的一个【后代中重定义】成员(而且这个后代要向上转换成本代!)
【始员】<=>在一个override成员函数的最后的一个virtual先员或abstract先员
【末员】<=>在一个成员函数的最先一个new virtual后员之前的最后一个override后员
【虚拟血脉】<=>对于一个非静态成员函数,其始员到末员之间的所有成员函数,我认为它实现了代码的"反向继承"

 ★以下是本人对虚拟的看法:
①virtual成员函数
        其{ }【尽量改用】末员的{ }
        是一个始员.开始第一段虚拟血脉
②override成员函数
        (访问性必须显式地与始员相同)
        (其最近一个先员必须是abstract或virtual或override的)
        其{ }【重定义了】始员的{ }
     但其{ }也是【尽量改用】末员的{ }
        
③abstract成员函数【本身没有{ }】,【必须取用】末员的{ }
        是一个始员,开始第一段虚拟血脉
        (有abstract成员函数的类型是abstract类,它不能被实例化和密封)

④new成员的在本代访问比先员【优先】(访问性可与先员不同)
        但本代可以通过全限定名来访问先员
⑤new virtual成员函数是一个始员,终止旧的虚拟血脉,开始一段新的虚拟血脉,这样就解决了Java中的版本问题
⑥不加继承修饰符就与先员同签名的成员,效果和new一样,但系统发出警告
⑦虚拟血脉上不允许静态
⑧接口成员隐式都是abstract的
⑨实现接口的abstract类可以将接口成员映射到abstract成员函数上
⑩在同一个成员声明中:
        static和override和virtual和abstract四种修饰符不能两两并存
        new和override不能并存

 ★例如,继承顺序ABS→A→B→C→D,以下
(注意右边的注释只能是对于4个同转换源的对象实体来说的:D d=new D();C c=d;B b=d;A a=d;ABS abs=d;):
class abstract ABS
{
    abstract E();//是始员,自己没有{ },取了{....①....}
}
class A:ABS
{
    override E(){........}//改用了{....①....}

        F(){........}//不变
     virtual G(){........}//改用了{....②....}
}
class B:A
{
    override E(){....①....}//是末员,不变

      new F(){........}//不变
    override G(){....②....}//是末员,不变
}
class C:B
{
   new virtual E(){........}//是始员,改用{....③....}
}
class D:C
{
   override E(){....③....}//是末员,不变
}

上一个:自定义事件的使用例程
下一个:上帝的单件模式(原创)

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,