using System;
using System.Collections.Generic;
using System.Text;
namespace _20200406
{
class Wife
{
/*java 的设计思想,属性私有化,行为公开化
* 访问修饰符
* private
*/
//数据成员**********************************************************
//字段:存储数据
private string name;
//属性:保护字段 本质就是2个方法
private string sex= "女";
/*属性
* 对字段起到保护作用,可实现只读、只写功能。set访问器和get访问器的有无来实现
* 本质就是对字段的读取和写入方法。
* 语法:
* [访问修饰符] 数据类型 属性名
* {
* get { return 字段 ; }
* set { 字段 = value ; }
*
* }
* 通常一个共有属性和一个私有字段对应。
* 属性只是外壳,实际上操作的私有字段。
* 其实访问器就是一个方法前面已经讲过了
* 属性是中间商,转手就把数据给字段
* 以后开发不需要写字段+方法,直接写属性即可
* 为了增强理解,我这里的代码多对照着看看
* 有些字段就不需要属性,因为他不需要被类的外面访问
* 写属性的目的就是为了保护字段的读写属性
*/
public string Sex
{
get
{
//读取时保护
return sex;
}
//显然性别就是只读的,不能写入,哈哈,不然媳妇就性别不对了
}
/*我们可以看到其实字段和属性的区别
* 字段首字母小写
* 属性首字母大写
*
* 当我们定义private字段的时候,需要再定义两个public方法,完成数据的存和取,从而达到保护数据的目的
* C#的祖师爷觉得这样做太麻烦,当然这也是Java的设计思想
* 所以C#单提出了public 属性的方式,当在类中定义了public sex属性的时候,
* 需要再初始化 get 和set 两个方法,其实作用类似 前面的private字段 定义的两个public方法
* 因此,当对象进行new实例化之后,可以直接通过对象.sex 进行属性的设置。
* 就不需要像private字段那样,通过方法对字段赋值,然后再通过方法获得值。
* 方便了很多,当然任何的方式都要视具体的情况而定
*/
//字段-age
private int age;
//属性-age-明白了吗
public int Age
{
get { return this.age; }
set
{
//这个就是写入数据的时候调用的方法
//判断的是value 而不是age 注意与下面的法法的区别
//注意,set方法没有传入的参数,所以这里要用value
//写入时保护
if (value <= 19 && value >= 18)
{
//注意这里不在是而是value
//this.age = age;
this.age = value;
}
else
{
throw new Exception("我不要");
}
}
}
//构造函数*********************************************************
/*提供了创建对象的方式,常常用于初始化类的数据成员。
* 一个类若没有构造函数,那么编译器会自动提供一个无参数构造函数
* 一个类若有构造函数,那么编译器就不会自动提供无参数的数构造函数了
* 特点:没有返回值,与类同名 创建对象时自动调用(不能手动调用)
* 其本质就是一个方法,在new 对象的时候调用的方法
* Wife wife03=new Wife("阿萨",18);
* 其实可以在初始化的时候,直接赋值,那么就需要在定义构造函数的时候
* 定义好形参变量,在new对象的时候,就可以直接操作了,非常方便,感谢祖师爷
* 以前我对构造函数的理解也不够深刻,现在茅塞顿开
*
* 另外插播一条设计模式:单例
* 也就是将构造函数私有化,由public Wife()-->private Wife()
* 这样外界就无法new出来一个新对象了,同时系统也不会给一个默认的新的构造函数
*/
//如果在new对象的时候,还是想先不传参数进来,也就是仍然沿用系统默认的构造函数
//那么就在这个类的内部,在定义一个系统默认的无参的构造函数,实现重载的功能
//如下:
public Wife()
{
Console.WriteLine("new新对象 就请调用");
}
//我们看,可以做任意多个有必要的重载方法
//另外name 字段,显然我没有进行属性保护,是可以直接访问的。
//多多思路,感谢祖师爷吧
public Wife(string name)
{
//this 这个关键字 在没有歧义的情况下也可以不写,可以省略
//既然有,就表示歧义是常见情况,为了提高代码的可读性,感谢祖师爷
this.name = name;
Console.WriteLine("new新对象 就请调用");
}
public Wife(string name, int age)
{
this.name = name;
//下面这句其实可以写成this.age=age;也可以执行,没有任何问题
//但是,这就相当于直接对字段赋值了,不会再执行属性中的代码块了
//也就是说起不到保护的作用了,
//为什么两种都可以呢?因为这是在类的内部,当然都有权限访问
this.Age = age;
Console.WriteLine("new新对象 就请调用");
}
//上面的三个初始化构造函数还可以重构,有继承的概念在里面
//重构如下
/*
*public Wife()
*{
* Console.WriteLine("new新对象 就请调用");
*}
*public Wife (string name):this()
*{
* this.name = name;
*}
*public Wife (string name , int age):this(name)
*{
* this.Age = age;
*}
*每个方法会自动调用“:this()”对应参数和无参数的那个构造函数
* 显然这种方式未来在维护更复杂类的时候,他的耦合性更低,修改起来更加便捷
* 相信我,需求变动是常有的事
*/
//方法成员**********************************************************
public void SetName(string name)
{
//this 这个对象(引用)
//this 关键字可以直接找到这个类的成员变量
this.name = name;
}
public string GetName()
{
return this.name;
}
public void SetAge(int age)
{
if (age<=19&&age>=18)
{
this.age = age;
}
else
{
throw new Exception("我不要");
}
}
public int GetAge()
{
return this.age;
}
}
}