日期:2014-05-16  浏览次数:20874 次

我继承CollectionBase,需要实现/调用什么函数才能让OnInsert被调用到?
我发现从CollectionBase继承一个类,并没有要求我实现诸如Add/Remove这样的函数接口,也能编译通过。

那么这个类的作用到底是什么呢? 什么时候它的OnInsert或此类的函数会被调用/回调?

谢谢。
------解决方案--------------------
CollectionBase是类,不是接口,非抽象方法如果你不重写,那么它调用基类的版本。
------解决方案--------------------
比如说你写
public class TA
{
    public string result;

    public void m1()
    {
        m2();
        m3();
    }

    protected virtual void m2()
    {
        result = "TA";
    }

    protected void m3()
    {
    }

}

public class TB : TA
{
    protected override void m2()
    {
        base.m2();
        this.result = "TB";
    }
}

此时如果你在TB类型对象实例调用m1,并且在m3中调试this,它是什么?是TB类型的对象实例。

因此可以说,所谓的“TA中的方法”,都是在TB对象中执行的。

有些人以为TB对象内部有个什么TA类型的对象,然后TB类型代码委派给TA类型代码去执行。这是完全不懂OO概念的。一个TB对象就是TA对象,你在TA类型中定义的代码就是在TB类型对象实例中执行,这个this就是TB类型的对象自己。

回到你的问题,所谓OnInsert代码就是在你的子类的对象的Add方法内执行。尽管你没有在子类中重写Add和OnInsert方法,但是只要你生明了“继承自CollectionBase”,于是在你的子类中的可执行代码也就无形中已经声明过了!
------解决方案--------------------
引用:
Quote: 引用:

CollectionBase是类,不是接口,非抽象方法如果你不重写,那么它调用基类的版本。


为什么"什么时候它的OnInsert或此类的函数会被调用/回调?"


结合着打一个比方可能更容易理解。比如说鸭嘴兽是哺乳动物,一个鸭嘴兽生了一个小鸭嘴兽,你会问“我看到鸭嘴兽喂奶,但是我怎么没有看到哺乳动物喂奶?”这个问题吗?

哺乳动物的“喂奶”行为是我们抽象出来的,我们分析出来的哺乳动物的行为,如果具体到一个鸭嘴兽,那么这个鸭嘴兽自己就有这些行为。

并不是说鸭嘴兽身体里住着另外一个哺乳动物,因此我们也无需纠结鸭嘴兽的喂奶跟哺乳动物的喂奶行为何时发生分离的问题。