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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 袁晓俊 于 2014-5-15 10:35 编辑

构造方法的重载(带参数),其中的参数不经过属性?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 练习题
{
    class student
    {
        public student()
        {
        }
        private int age;
        private string name;
        private char sex;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public int Age
        {
            get { return age; }
            set
            {

                if (value < 20 )
                {
                    Console.WriteLine("年龄不合法!");
                    age =0;
                }
                else
                {
                    age =value;
                }
            }
        }

        public char Sex
        {
            get { return sex; }
            set { sex = value; }
        }
        public student(string name, int age, char sex)
        {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
        public student(string name)
        {
            this.name = name;
            this.age = 2;
            this.sex = '女';
        }
        public void seyhello()
        {
            Console.WriteLine("姓名为{0}的年龄为{1}性别为{2}", name, age, sex);
        }

    }
}





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 练习题
{
    class Program
    {


        static void Main(string[] args)
        {
            student a = new student();
            a.Name = "A";
            a.Sex = '男';
            a.Age = 2;
            a.seyhello();


            student b = new student("b");
            b.seyhello();


            student c = new student("张三", 9, '男');
            c.seyhello();
            Console.ReadKey();

        }
    }
}

为什么带参数的重载的字段不经过属性的判断呢?
b 和张三的年龄应该报“不合法”啊,是构造方法的重载不提供属性字段的调用?

QQ截图20140515100725.jpg (33.92 KB, 下载次数: 31)

QQ截图20140515100725.jpg

评分

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

查看全部评分

7 个回复

倒序浏览
b 和张三的年龄应该报“不合法”啊,是构造方法的重载不提供属性字段的调用?
回复 使用道具 举报
本帖最后由 Darkhorse′Xa 于 2014-5-15 10:37 编辑

你构造函数里头都是对字段的赋值,所以的话没有进行数据的非法判断
应该把赋值给字段改成赋值属性,这样才会用到setget访问器.
在你代码上修改了一下,可以看一下
  1. <p>
  2.            static void Main(string[] args)
  3.         {
  4.             Student a = new Student();
  5.             a.Name = "A";
  6.             a.Sex = '男';
  7.             a.Age = 2;
  8.             a.seyhello();
  9.             Student b = new Student("b");
  10.             b.seyhello();
  11.             Student c = new Student("张三", 9, '男');
  12.             c.seyhello();</p><p>            Student stu = new Student("李四", 25, '男');//合法数据
  13.             stu.seyhello();
  14.             Console.ReadKey();</p><p>}</p><p>          class Student
  15.      {
  16.       
  17.             private int age;
  18.             private string name;
  19.             private char sex;
  20.             public string Name
  21.             {
  22.                 get { return name; }
  23.                 set { name = value; }
  24.             }
  25.             public int Age
  26.             {
  27.                 get { return age; }
  28.                 set
  29.                 {</p><p>                      if (value < 20)
  30.                     {
  31.                         Console.WriteLine("年龄不合法!");
  32.                         age = 0;
  33.                     }
  34.                     else
  35.                     {
  36.                         age = value;
  37.                     }
  38.                 }
  39.             }</p><p>            public char Sex
  40.             {
  41.                 get { return sex; }
  42.                 set { sex = value; }
  43.             }
  44.             public Student(string name, int age, char sex)
  45.             {
  46.                 this.Name = name;//对属性的赋值,而不是字段,否则你没法进行数据非法判断
  47.                 this.Age = age;
  48.                 this.Sex = sex;
  49.             }
  50.             public Student(string name)
  51.             {
  52.                 this.Name = name;
  53.                 this.Age = 2;
  54.                 this.Sex = '女';
  55.             }
  56.             public Student()
  57.             {
  58.             }
  59.             public void seyhello()
  60.             {
  61.                 Console.WriteLine("姓名为{0}的年龄为{1}性别为{2}", name, age, sex);
  62.             }   
  63.     }</p>
复制代码

评分

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

查看全部评分

回复 使用道具 举报
解决了,显示出来的内容用在get中写,然后在sayhello方法中的输出字段应该为属性的Age.
回复 使用道具 举报
你说的也可以,,,,感谢,,,,
回复 使用道具 举报
袁晓俊 发表于 2014-5-15 10:37
你说的也可以,,,,感谢,,,,

一同学习:lol
回复 使用道具 举报
回复 使用道具 举报
林枫 中级黑马 2014-5-16 17:07:34
8#
本帖最后由 林枫 于 2014-5-16 17:44 编辑

你还是没有理解什么叫做属性,属性说白了就是两个方法,set 和get ,你在构造函数中直接给变量赋值根本就没有调用属性 属性怎么会验证你输入的是否合法呢?  
这是你声明的变量
private int age;
这是你声明的属性
public int Age
        {
            get { return age; }
            set
            {

                if (value < 20 )
                {
                    Console.WriteLine("年龄不合法!");
                    age =0;
                }
                else
                {
                    age =value;
                }
            }
        }
你的属性就相当于下面的方法
public int GetAge() //get 访问器
{
return age;
}
public void SetAge(int value) //set 访问器
{
if (value < 20 )
                {
                    Console.WriteLine("年龄不合法!");
                    age =0;
                }
                else
                {
                    age =value;
                }
}你给属性赋值或者是读取属性的值都相当于调用这两个方法。
你在构造函数里根本就没有对属性进行操作,也就是说根本就没有调用方法。
那么它就不可能执行你方法里面的代码。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马