A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李贤贤 中级黑马   /  2013-3-11 19:05  /  2165 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有道小题是这样的:一个父类有几个属性,两个子类分别有各自的方法。要求是调用父类构造函数给子类字段赋值,这块不太明白?

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 郑志强 于 2013-3-11 20:37 编辑

我们自己写父类的构造函数。  为的是创建子类构造函数可以通过:base调用父类构造函数,可以不用在为子类重新创建属性

你可以看看下面代码

是为了子类的SayHi方法可以不用在声明属性。直接调用父类的属性。
public class Person   //这是父类
    {
        string _name;
        public string Name { get { return _name; } set { _name = value; } }
        int _age;
        public int Age { get { return _age; } set { _age = value; } }

        public Person(string name, int age)  //父类构造函数
        {
            this.Name = name;
            this.Age = age;
        }
    }
public class student:  Person  
    {
        public void SayHi()
        {
            Console.WriteLine("大家好,我叫{0},我今年{1}岁了", this.Name, this.Age);
        }
        public student(string name, int age)
            : base(name, age)//这里如果不调用父类构造函数,方法SayHi的this.Name和this.Age就没办法接收到父类这两个的属性。
        {
        }

    }

评分

参与人数 2技术分 +1 黑马币 +20 收起 理由
张文 + 1
边亮 + 20

查看全部评分

回复 使用道具 举报
你好,你说的这个问题应该是用base关键字调用父类构造函数;
在类的继承中,子类不会继承父类构造函数,但是会默认调用父类无参的构造函数;
如果要显示的调用父类的有参数构造函数,要用base关键字。
请见下面代码

    class Program
    {
        static void Main(string[] args)
        {
            Teacher t = new Teacher("jack", 30, "123456");
        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }

    class Teacher : Person
    {
        public string ID { get; set; }
        public Teacher(string name1, int age1,string ID)
            : base(name1,age1)//构造函数为子类有参数构造函数,用base关键字调用父类构造函数
        {
            this.ID = ID;
        }
    }
回复 使用道具 举报
   public class Person//父类 其中有自己的字段属性和构造函数
    {
        string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        public Person(string name, int age)//父类的构造函数,原来无参数的构造函数被干掉
        {
            this.Name = name;
            this.Age = age;
        }

    }

    public class Programmaer:Person//子类  继承父类有自己的字段属性和构造函数
    {
        int _workYear;

        public int WorkYear
        {
            get { return _workYear; }
            set { _workYear = value; }
        }

        public void ProSay()//子类中的方法
        {

            Console.WriteLine("大家好,我叫{0},今年{1}岁了,我的工作年限是{2}",this.Name,this.Age,this.WorkYear);
        }

        public Programmaer(string name, int age, int workyear)//base表示调用父类的构造函数
            : base(name, age)
        {
            this.WorkYear = workyear;
        }
    }
这里有base代表调用了父类的有参数的构造函数,你赋值name,age 就直接调用父类的构造方法,然后再传递给子类。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
郑志强 发表于 2013-3-11 20:32
我们自己写父类的构造函数。  为的是创建子类构造函数可以通过:base调用父类构造函数,可以不用在为子类重 ...

请问一下,你的代码里面base 是不是super : 是不是extends 的意思呢?
回复 使用道具 举报
虽然上面的同学已经回答的很好了!但是还是决定一起讨论下吧,互相学习!
    class Program
    {
        static void Main(string[] args)
        {
            //Driver类中的显性调用父类构造函数,作用就是在这里传值就可以了
             //调用了父类的属性
            Driver  pro= new Driver("司机", 20, 10);
            //调用自己独有的方法
            pro.ProSay();
            Reporter rep = new Reporter("记者", 10, "采访");
            rep.ReSay();
            Console.ReadKey();
        }
    }

    //假设有两个类司机和记者,这两个类的共同特点就是都是人,都有姓名和年龄
    //所以就 声明一个人类让司机和记者两个类继承人类,他们可以有人类的属性,
    //并可以在自己的类里面声明自己独有的属性,便于理解点就是可以省代码
    //声明人类
    public class Person
    {
        string _name;//姓名

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        int _age;//年龄
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
         //父类构造函数 ,便于子类调用
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }

    }
     //司机类,继承人类,继承后有人类的属性,
    //并且可以有自己的属性 _workYear为自己的特有属性
    public class Driver:Person
    {
        int _workYear;

        public int WorkYear
        {
            get { return _workYear; }
            set { _workYear = value; }
        }
         //司机自己的方法
        public void ProSay()
        {

            Console.WriteLine("大家好,我叫{0},今年{1}岁了,我的工作年限是{2}",this.Name,this.Age,this.WorkYear);
        }
        //base:显性调用父类的构造函数,name age起到了传值的作用
        public Driver(string name, int age, int workyear)
            : base(name, age)
        {
            this.WorkYear = workyear;
        }
    }

    //记者类,继承人类
    public class Reporter : Person
    {
        string _hobby;  //假设记者的特有属性

        public string Hobby
        {
            get { return _hobby; }
            set { _hobby = value; }
        }
          //base显性调用父类构造函数
        public Reporter(string name, int age, string hobby)
            : base(name, age)
        {
            this.Hobby = hobby;
        }
         //自己独有的方法
        public void ReSay()
        {
            Console.WriteLine("大家好,我叫{0},我的爱好是{1},",this.Name,this.Hobby);
        }
    }
便于看,我把类都写在了同一个界面,类最好是在项目里添加类。大家共同学习,一起努力!一起加油!!

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
李准 中级黑马 2013-3-11 21:13:02
7#
回复中的表情符号是子类继承父类的冒泡,回复自动转换为表情符号了,亲,不好理解错哦!刚忘了对你说了!{:soso_e112:}就这个表情是表示冒号!
回复 使用道具 举报
小马过河 发表于 2013-3-11 20:58
请问一下,你的代码里面base 是不是super : 是不是extends 的意思呢?

不好意思,我进错屋子了,sorry!
回复 使用道具 举报
1、以下代码供参考
public class Person    //父类
    {
        string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }


public class Programmaer:Person   //继承
    {
        int _workYear;
        public int WorkYear
        {
            get { return _workYear; }
            set { _workYear = value; }
        }
        public void ProSay()
        {
            Console.WriteLine("大家好,我叫{0},今年{1}岁了,我的工作年限是{2}",this.Name,this.Age,this.WorkYear);
        }
        public Programmaer(string name, int age, int workyear)
            : base(name, age)//base用来表示父类,可以用于访问父类的成员
        {
            this.WorkYear = workyear;
        }
    }




回复 使用道具 举报

RE: 面向对象中的问题

郑志强 发表于 2013-3-11 20:32
我们自己写父类的构造函数。  为的是创建子类构造函数可以通过:base调用父类构造函数,可以不用在为子类重 ...

十分感谢哈:victory:
回复 使用道具 举报
宋健 发表于 2013-3-11 20:40
你好,你说的这个问题应该是用base关键字调用父类构造函数;
在类的继承中,子类不会继承父类构造函数,但 ...

谢谢啦!
回复 使用道具 举报
学习了!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马