1.组件是什么?什么样的一段程序算是一个组件2.当一个类的定义中包含另一个类时,创建外部类时,内部类是否创建?比如:
class A
{

   B a;
}
A a=new A;
B的对象是否会创建,即B的构造函数是否会调用3.virtual函数是从直接基类中继承,还是从virtual函数(同名)的最初定义的类处继承,假设已有派生类重写virtual函数了,比如:
class base
{
 virtual void vf()
 {}
}
class d1: base
{
override void vf()
 {}
}
class d2:d1
{}
那么d2中的vf是来自base还是d1.4.c++中,基类指针和派生类指针是可以互相转化的,派生类的可直接付给基类(隐式转换),基类的可强制类型转换赋给派生类的指针。c#中这种情况下的转化规则是什么呢?当类派生自接口类时又是怎样的呢?5.同一类不同对象的同名事件是否可以委派不同的处理方法?即委派的处理方法是针对对象的还是针对类的6.接收基类对象参数的地方,是否可以以派生类对象传入?7.调用BeginXX(如accept,recevie等)将开始新的线程,这个线程是属于用户线程还是系统线程?它的启动和结束如何管理,如果socket调用了shutdown或close,由它开始的接收或发送线程是否会立即结束?8.使用异步socket时,调用了BeginXX会开始一个新线程,比如BeginReceive,系统会在新线程中调用BeginReceive的回调函数。请问这个回调函数是在收到信息时调用,还是在BeginReceive结束后立即创建系统线程,此线程执行回调函数?
如果是前者,msdn上的系统接受线程在EndReceive上阻塞是什么意思?希望高手予以解惑,回答部分问题也可

解决方案 »

  1.   

    1.组件是什么?什么样的一段程序算是一个组件
    简单说就是实现ICOmponent接口的一个类。2.当一个类的定义中包含另一个类时,创建外部类时,内部类是否创建?比如:
    class A
    {

      B a;
    }
    A a=new A;
    B的对象是否会创建,即B的构造函数是否会调用按照你的写法是不会,因为B在类A里还没有被赋值(初始化)3.virtual函数是从直接基类中继承,还是从virtual函数(同名)的最初定义的类处继承,假设已有派生类重写virtual函数了,比如:
    class base
    {
    virtual void vf()
    {}
    }
    class d1: base
    {
    override void vf()
    {}
    }
    class d2:d1
    {}
    那么d2中的vf是来自base还是d1.来自d1.4.c++中,基类指针和派生类指针是可以互相转化的,派生类的可直接付给基类(隐式转换),基类的可强制类型转换赋给派生类的指针。c#中这种情况下的转化规则是什么呢?当类派生自接口类时又是怎样的呢?C#也可以互相转化5.同一类不同对象的同名事件是否可以委派不同的处理方法?即委派的处理方法是针对对象的还是针对类的
    是针对对象的6.接收基类对象参数的地方,是否可以以派生类对象传入?
    可以,C#可以说是完全的OO语言,里面的面向接口编程就是你说的意思。7.调用BeginXX(如accept,recevie等)将开始新的线程,这个线程是属于用户线程还是系统线程?它的启动和结束如何管理,如果socket调用了shutdown或close,由它开始的接收或发送线程是否会立即结束?
    参看这篇文章http://www.zxbc.cn/html/20090821/72741.html,写的很好8.使用异步socket时,调用了BeginXX会开始一个新线程,比如BeginReceive,系统会在新线程中调用BeginReceive的回调函数。请问这个回调函数是在收到信息时调用,还是在BeginReceive结束后立即创建系统线程,此线程执行回调函数?
    如果是前者,msdn上的系统接受线程在EndReceive上阻塞是什么意思?
    个人认为是在收到信息时调用。至于说在EndReceive上阻塞可能指的是BeginReceive一直收不到数据,就一直不会进行回调,而我们通常都是在回调函数里判断是否接受完毕,然后决定是否调用EndReceive来处理接受的信息的,所以说在EndReceive上阻塞应该是这个意思,这个是我个人的理解。所有不对请楼下的扶正。
    希望高手予以解惑,回答部分问题也可
      

  2.   

    首先感谢2楼的耐心回复。
    小弟还有些疑问
    2.对于这种问题是不是要在创建完A类对象时,需要用a.a=new B()来完成整个对象的创建呢,还是有更简单的方法。3.如果d1中对vf的定义是virtual void vf()那么,d2中的vf来自哪个呢。我在看书时看到这样一句话:new可以用来创建新版本的virtual方法,以被后面的派生类继承,否则后面的派生类继承的是顶层基类的函数版本。这句话怎么理解呢
      

  3.   

    2.对于这种问题是不是要在创建完A类对象时,需要用a.a=new B()来完成整个对象的创建呢,还是有更简单的方法。a.a=new B()肯定可以完成B的创建。
    不过最好最简单的是在A的构造函数里对B进行初始化
      

  4.   


    再明确点说就是class A
    {
      ....
      public A()
      {
        this.a=new B();
      }
    }
      

  5.   


    再明确点说就是class A
    {
      ....
      public A()
      {
        this.a=new B();
      }
    }
      

  6.   

    3.如果d1中对vf的定义是virtual void vf()那么,d2中的vf来自哪个呢。我在看书时看到这样一句话:new可以用来创建新版本的virtual方法,以被后面的派生类继承,否则后面的派生类继承的是顶层基类的函数版本。这句话怎么理解呢 
     这个问题谁理解,讲讲吧
      

  7.   

    NEW不NEW都无所谓吧?            c1 c = new c2();
                c.con();//输出c1,加了NEW也是一样
            }
        }
        class c1
        {
            public virtual void con()
            {
                Console.WriteLine("c1");
            }
        }
        class c2 : c1
        {
            public void con()//如果改成public override void con()则输出c2
            {
                Console.WriteLine("c2");
            }
        }
    }
      

  8.   

    是这样的:
    如果B1是顶层基类,依次派生出B2,B3派生于B2,如果B1,B2都定义virtual vf(),那么B3继承谁的呢?照书上的意思是继承自B1(顶层基类),除非B2中用new从新定义virtual vf(),有机会写个代码实验下吧,还是。
      

  9.   

    看来我是理解错了,我试了一下确实是不加new时,编译器会给出警告,但用new来声明vf的作用仅仅是不让有警告吗?有没有其它作用呢?下面是我的测试代码:
             private void button1_Click(object sender, System.EventArgs e)
    {
    B1 d=new D();
    d.vf();
    } public class B1
    {
    public virtual void vf()
    {
    MessageBox.Show("B1中虚函数调用");
    }
    }
    public class B2:B1
    {
    public vitrual void vf()
    {
    MessageBox.Show("B2中虚函数调用");
    }
    }
    public class D:B2
    { }
    第一个函数是我的form按钮的消息响应函数,下面的为测试的类:
    B2中不加new,编译器会给出警告,但是可以运行,结果是B1的虚函数调用。当我加上new时,警告消失,但结果仍是B1虚函数调用(我觉着此处应该调用B2的虚函数啊,不解)。
    当我吧d的类型声明成D的时候,结果都是B2虚函数调用,加new的结果只是消除编译器警告。真是这样吗?谁能解释下啊。override可以实现覆盖,new的作用到底是什么呢?
      

  10.   

    你用了这句:B1 d=new D(); 其结果当然是B1.vf被调用了。
    这里有个隐式转换,就是把派生类D,转化成了基类B1,如果你用D d=new D();
    那么d.vf就肯定不是B1的了。呵呵。
      

  11.   

    那个new的作用到底是什么呢?就是所
    public new virtual void vf()
    这种形式到底什么时候用呢?
    用了它有什么作用呢?难到就是为了使编译器不给出警告?
      

  12.   

    new在这里起到“隔断”的作用。
    例如:
    D2 d2=new D2();
    d2.vf();//这里的vf()即是其父类D1中的vf().new的作用是隔断了基类B1中vf()的向后继承。
      

  13.   


    不明白你的解释。什么叫“隔断”呢?
    B2 b2=new B2();
    B2的vf定义中不加new,上面的b2。vf也会调用B2的vf的,只不过编译器会给出警告而已。
      

  14.   


    啊,这个例子举得忒不合适。看看子类不加关键字new的警告吧。
    “ConsoleApplication11.D1.vf()”将隐藏继承的成员“ConsoleApplication11.B2.vf()”。若要使当前成员重写该实现,请添加关键字 override。否则,添加关键字 new。如果子类不加关键字new,系统会自动隐藏基类的同名方法——也即自动实现了new的作用。但这种自动隐藏基类的方法肯定是不安全的,至于怎么个不安全法,我就不知道了。有没有new,得到的中间语言的代码都是相同的。这中间除了编译错误以外有什么区别,跟楼主一样期待高手。
      

  15.   

    那就是说从中间代码级别来看new和没有new是一样的了?
    就是说new只是使编译器没有警告而已,加了new表明代码是安全的,不加可能是不安全的。
    个人感觉这个new应该有更多作用
      

  16.   

    一般来说,如果父类和基类有相同的方法,而且父类声明virtual的话,那么子类就要声明override或者new,这两者明星是不同的,new的作用就是隐藏基类的同名方法。如果仍然声明virtual,就会出现警告,可是这个操作会有什么严重后果呢?不清楚
      

  17.   

    开来关于new virtual都加都没注意过啊
      

  18.   

    通常来说,系统警告我就认为是错误了。
    楼主继续那个warning 的问题已经没有多少意义了。