继承
继承是OOP最重要的特性之中的一个。不论什么类都能够从还有一个类中继承,这就是说,这个类拥有它继承的类的全部成员。
对象的继承代表了一种“is-a”的关系。假设两个对象A和B。能够描写叙述为“B是A”,则表明B能够继承A。
假设子类继承与父类,第一、子类拥有父类非private的属性和功能;第二、子类具有自己的属性和功能,即子类能够扩展父类没有的属性和功能;第三、子类还能够以自己的方式实现父类的功能(方法重写)。
比如:考虑一个农场家禽家畜的类。这个类叫做Animal,拥有EatFood()和Breed()方法,我们能够创建一个子类Cow。支持全部这些方法。它也有自己的方法。如Moo()和SupplyMilk()。还能够创建还有一个子类Chicken,该类有Cluck()和LayEgg()
继承的长处:继承使得全部子类公共的部分都放在了父类,使得代码得到了共享。这就避免了反复,另外,继承可使得改动或扩展继承而来的实现都较为easy。
继承是OOP最重要的特性之中的一个。不论什么类都能够从还有一个类中继承,这就是说,这个类拥有它继承的类的全部成员。
在OOP中,被继承的类称为父类。
在C#中的对象仅能直接派生于一个基类。
对象的继承代表了一种“is-a”的关系。假设两个对象A和B。能够描写叙述为“B是A”,则表明B能够继承A。
“猫是哺乳动物”。就说明了猫与哺乳动物之间继承与被继承的关系。实际上,继承者还能够理解为是被继承者的特殊化,由于它除了具备被继承者的特殊性外,还具备自己独有的个性。比如,猫就可能拥有抓老鼠、爬树等“哺乳动物”对象所不具备的属性。
假设子类继承与父类,第一、子类拥有父类非private的属性和功能;第二、子类具有自己的属性和功能,即子类能够扩展父类没有的属性和功能;第三、子类还能够以自己的方式实现父类的功能(方法重写)。
比如:考虑一个农场家禽家畜的类。这个类叫做Animal,拥有EatFood()和Breed()方法,我们能够创建一个子类Cow。支持全部这些方法。它也有自己的方法。如Moo()和SupplyMilk()。还能够创建还有一个子类Chicken,该类有Cluck()和LayEgg()
class Program
{
static void Main(string[] args)
{
Cow cow = new Cow("牛牛");
cow.EatFood();
cow.Breed();
cow.Moo();
cow.SupplyMilk();
Console.WriteLine();
Chicken chicken = new Chicken("咕咕");
chicken.EatFood();
chicken.Breed();
chicken.Cluck();
chicken.LayEgg();
}
}
//动物类
class Animal
{
protected string name = "";
public Animal(string name)
{
this.name = name;
}
public void EatFood() //吃东西
{
Console.WriteLine(this.name + "会吃东西");
}
public void Breed() //生殖后代
{
Console.WriteLine( this.name + "能生殖后代");
}
}
class Cow:Animal
{
public Cow(string name): base(name)
{ }
public void Moo() //牛叫
{
Console.WriteLine( "我的名字叫" + name + " 哞");
}
public void SupplyMilk() //提供牛奶
{
Console.WriteLine( "我的名字叫" + name + " 我能提供牛奶");
}
}
class Chicken : Animal
{
public Chicken(string name):base(name)
{ }
public void Cluck() //鸡叫
{
Console.WriteLine("我的名字叫" + name + " 咯咯咯");
}
public void LayEgg() //下蛋
{
Console.WriteLine("我的名字叫" + name + " 我能下蛋");
}
}
继承的长处:继承使得全部子类公共的部分都放在了父类,使得代码得到了共享。这就避免了反复,另外,继承可使得改动或扩展继承而来的实现都较为easy。
继承的缺点:假设父类改变,那么子类就不得不变。
继承会破坏包装,父类实现细节暴露给子类。增大了两个类之间的耦合性。