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上阻塞是什么意思?希望高手予以解惑,回答部分问题也可
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上阻塞是什么意思?希望高手予以解惑,回答部分问题也可
简单说就是实现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.对于这种问题是不是要在创建完A类对象时,需要用a.a=new B()来完成整个对象的创建呢,还是有更简单的方法。3.如果d1中对vf的定义是virtual void vf()那么,d2中的vf来自哪个呢。我在看书时看到这样一句话:new可以用来创建新版本的virtual方法,以被后面的派生类继承,否则后面的派生类继承的是顶层基类的函数版本。这句话怎么理解呢
不过最好最简单的是在A的构造函数里对B进行初始化
再明确点说就是class A
{
....
public A()
{
this.a=new B();
}
}
再明确点说就是class A
{
....
public A()
{
this.a=new B();
}
}
这个问题谁理解,讲讲吧
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");
}
}
}
如果B1是顶层基类,依次派生出B2,B3派生于B2,如果B1,B2都定义virtual vf(),那么B3继承谁的呢?照书上的意思是继承自B1(顶层基类),除非B2中用new从新定义virtual 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的作用到底是什么呢?
这里有个隐式转换,就是把派生类D,转化成了基类B1,如果你用D d=new D();
那么d.vf就肯定不是B1的了。呵呵。
public new virtual void vf()
这种形式到底什么时候用呢?
用了它有什么作用呢?难到就是为了使编译器不给出警告?
例如:
D2 d2=new D2();
d2.vf();//这里的vf()即是其父类D1中的vf().new的作用是隔断了基类B1中vf()的向后继承。
不明白你的解释。什么叫“隔断”呢?
B2 b2=new B2();
B2的vf定义中不加new,上面的b2。vf也会调用B2的vf的,只不过编译器会给出警告而已。
啊,这个例子举得忒不合适。看看子类不加关键字new的警告吧。
“ConsoleApplication11.D1.vf()”将隐藏继承的成员“ConsoleApplication11.B2.vf()”。若要使当前成员重写该实现,请添加关键字 override。否则,添加关键字 new。如果子类不加关键字new,系统会自动隐藏基类的同名方法——也即自动实现了new的作用。但这种自动隐藏基类的方法肯定是不安全的,至于怎么个不安全法,我就不知道了。有没有new,得到的中间语言的代码都是相同的。这中间除了编译错误以外有什么区别,跟楼主一样期待高手。
就是说new只是使编译器没有警告而已,加了new表明代码是安全的,不加可能是不安全的。
个人感觉这个new应该有更多作用
楼主继续那个warning 的问题已经没有多少意义了。