读书人

关于子类与父类.解决方法

发布时间: 2013-04-02 12:35:26 作者: rapoo

关于子类与父类.
public class Ractangle {
private double width;
public double height;
public double Width {
set {
if (0 < value) {
this.width = value;
}
else {
this.width = value;
}
}
get {
return this.width;
}
}
public double Height {
set {
if (0 < value) {
this.height = value;
}
else {
this.height = -1;
}
}
get {
return this.Height;
}
}
public Ractangle(double w, double h) {
if (0 < w && 0 < h) {
this.width = w;
this.height = h;
}
}
}
//这里报错:Page180Ex04.Ractangle' does not contain a constructor that takes 0 arguments
public class ExRactangle:Ractangle {
public ExRactangle(double w, double h,int a) {
if (0 < w && 0 < h) {


base.Width = w;
base.Height = h;
}
}
public double CalcRactangeArea() {
return this.Height * this.Width;
}
}
//也就是说,我不知道这个设计为什么这样子,子类 有有参的构造方法时,为什么父类要有一个无参的构造方法?
[解决办法]
我想这种错误只在你创建对象的时候才会出现吧?
[解决办法]
原来楼主知道解决方法了,说下原因吧,因为在new一个实例的时候,要调用继承链上所有类的构造器,直到Object的构造器,那为什么我们有时候不在构造器调用父类的构造器呢,因为编器器帮我们自动生成了相应的代码。
针对上面的代码,因为你的基类定义了一个带参数的构造器,所以编译器不会再为你生成默认的无参构造器,因此在编绎时,为子类构造器调用基类默认构造器会提示不存在。
你也可以在子类构造器中显示调用基类构造器,:base(p1,p2,p3)
[解决办法]
4楼说的差不多了,补充说点
因为子类是继承父类的成员,甚至在构造的使用就要用父类的成员,这个时候要是父类不先实例化的话,就可能造成空引用、未示例化等情况。
所以,C#要求在子类调用构造函数时,必须先调用基类的构造函数。然后,你在父类中定义了一个有参数的构造函数,就把默认自带无参数覆盖了,然而子类实例化时默认是调用基类的这个无参数的构造函数的,你说的问题就出现。
两个解决方案:
1.在基类加一个无参数构造函数。
2.在子类显示地指定调用基类的有参构造函数。
[解决办法]
http://msdn.microsoft.com/zh-cn/library/k6sa6h87(v=vs.80).aspx

看看“示例3”!

读书人网 >C#

热点推荐