属性是一个方法或一对方法,但在调用他的代码来看,他就是一个字段,即属性适合于以字段的方式使用方法调用的场合。
字段是存储类要满足其设计所需要的数据,字段是与类相关的变量。
public class Cat
{
//声明一内部字段,注意是private,默认叫的次数是3
private int shoutnum = 3;
//ShoutNum属性,注意是public,当中有两个方法
//get表示外界调用是可以得到shoutnum的值
//set表示外界可以给内部的shoutnum赋值
public int ShoutNum
{
get { return shoutnum; }
set { shoutnum = value; }
}
}
上面代码中的private 和public都是修饰符。public 表示所修饰的类成员可以允许其他任何类来访问,俗名公有的。private 表示只允许同一个类中的成员访问,其他类包括他的子类无法访问,俗名私有的。如果类中的成员没有加修饰符,则默认为private。通常字段都是private,属性都是public。通常情况下,属性名称首字母大写,而字段则一般是首字母小写或者前面加‘_’。{
//声明一内部字段,注意是private,默认叫的次数是3
private int shoutnum = 3;
//ShoutNum属性,注意是public,当中有两个方法
//get表示外界调用是可以得到shoutnum的值
//set表示外界可以给内部的shoutnum赋值
public int ShoutNum
{
get { return shoutnum; }
set { shoutnum = value; }
}
}
属性有两个方法get和set。get访问器返回与声明的属性相同的数据类型,表示的意思是调用是可以得到内部字段的值或者引用;set访问器没有设置参数,用关键词value表示,他的作用是调用属性是可以给内部的字段或引用赋值。
封装
封装是面向对象的三大特性之一。每个对象都包含他能进行操作所需要的所有信息,这个特性成为封装,因为对象不必依赖其他对象来完成自己的操作。
封装的好处:良好的封装能减少耦合;类内部的实现可以自由地修改;类具有清晰的对外接口。
继承
面向对象的第二大特征就是继承。对象的继承代表了一种‘is-a’的关系,如果两个对象A和B,可以描述为‘B是A’,则表明B可以继承A。猫是哺乳动物,就说明了猫与哺乳动物之间的继承和被继承的关系。继承者可以理解为被继承者的特殊化,因为他除了具备被继承者的特性外,还具备自己独有的个性。继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,或叫做基类和派生类,其中子类继承父类的所有的特性。子类不但继承了父类的所有特性,还可以定义新的特性。
如果子类继承于父类,第一,子类拥有父类非private的属性和功能;第二,子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;第三,子类可以以自己的方式实现父类的功能(方法重写)。
protected表示继承时子类可以对基类有完全访问权。也就是说protected修饰的类成员,对子类公开,但不对其他类公开。子类继承了父类,则基类拥有了父类的除private外的属性和功能。
动物基类:
public class Animal
{
protected string name = "";
public Animal(string name)
{
this.name = name;
}
public Animal()
{
this.name = "无名";
}
protected int shoutNum = 3;
public int ShoutNum
{
get { return shoutNum; }
set { shoutNum = value; }
}
}
猫子类:{
protected string name = "";
public Animal(string name)
{
this.name = name;
}
public Animal()
{
this.name = "无名";
}
protected int shoutNum = 3;
public int ShoutNum
{
get { return shoutNum; }
set { shoutNum = value; }
}
}
public class Cat : Animal
{
public Cat()
: base()
{ }
public Cat(string name)
: base(name)
{ }
public string Shout()
{
string result = "";
for (int i = 0; i < shoutNum; i++)
{
result = result + "嘧,";
}
return "我的名字叫" + name + " " + result;
}
}
狗子类:{
public Cat()
: base()
{ }
public Cat(string name)
: base(name)
{ }
public string Shout()
{
string result = "";
for (int i = 0; i < shoutNum; i++)
{
result = result + "嘧,";
}
return "我的名字叫" + name + " " + result;
}
}
public class Dog : Animal
{
public Dog()
: base()
{ }
public Dog(string name)
: base(name)
{ }
public string Shout()
{
string result = "";
for (int i = 0; i < shoutNum; i++)
{
result = result + "汪,";
}
return "我的名字叫" + name + " " + result;
}
}
{
public Dog()
: base()
{ }
public Dog(string name)
: base(name)
{ }
public string Shout()
{
string result = "";
for (int i = 0; i < shoutNum; i++)
{
result = result + "汪,";
}
return "我的名字叫" + name + " " + result;
}
}
子类从他的父类中继承的成员有方法、域、属性、事件、索引指示器,但对于构造方法,他不能被继承,只能被调用。对于调用父类的成员,可以用base关键词。
继承的优点是:继承是所有子类公共部分都放在了父类,使得代码得到共享,这就避免了重复,另外,继承可使得修改和扩展继承而来的实现都比较容易。
继承的缺点是:当父类变,则子类不得不变。继承会破坏包装,父类实现细节暴露给了子类。