首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-04-02 
关于子类与父类.public class Ractangle {private double widthpublic double heightpublic double Widt

关于子类与父类.
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”!

热点排行