读《必须知道的.NET》笔记(一) 继承
一直都觉得自己的基础不够扎实,由于之前看过《知道的.NET》电子版,觉得不错,所以决定买本回来,平时没有写博客的习惯,但今天刚好是周末,玩完军棋和L4D,觉得有点无聊。所以就有了这遍(其实也是第一遍比较有意义的)文章,回归正题。第一遍学习笔记是关于继承的,以下的内容基本都是.NET书里的,感谢作者(是不是应该要先感谢国家呢?)
原话:
继承,就是面向对象中类与类之间的一种关系。继承的类称为子类、派生类,而被继承的类称为父类、基类或超类。
通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次。
* 实现继承:派生类继承了基类的所有属性和方法,并且只能有一个基类,在.NET中System.Object是所有类型的最终基类,这种继承方式称为实现继承。
*接口继承:派生类继承了接口的方法签名。不同于实现继承的是,接口继承允许多继承,同时派生类只继承了方法签名而没有方法实现,具体的实现必须在派生类中完成。
因此,确切地说,这种继承方式应该称为接口实现。
以下是例子:
以上是一个简单的三层继承层次,Animal是所有类型的基类(抽象类),Eat方法和ShowType方法(virtual 虚函数),其具体实现在子类Chicken中给出。
代码如下:
基类:Aminial
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
abstract class Animal
{
public void Eat()
{ }
public abstract void ShowType();
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
abstract class Animal
{
public void Eat()
{ }
public abstract void ShowType();
}
}
Animal的派生类Bird
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Bird:Animal
{
public string Type = "Brids";
public override void ShowType()
{
Console.WriteLine("The Type is :{0}",Type);
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Bird:Animal
{
public string Type = "Brids";
public override void ShowType()
{
Console.WriteLine("The Type is :{0}",Type);
}
}
}
Bird的派生类Chicken
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Chicken:Bird
{
private string color;
public string Color
{
set { color = value; }
get { return color; }
}
public override void ShowType()
{
Console.WriteLine("The Type is {0}.",Type);
}
public void ShowColor()
{
Console.WriteLine("The {0} color is {1}.",Type,color);
}
private string Type = "chicken";
private string sex = "雄鸡";
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Chicken:Bird
{
private string color;
public string Color
{
set { color = value; }
get { return color; }
}
public override void ShowType()
{
Console.WriteLine("The Type is {0}.",Type);
}
public void ShowColor()
{
Console.WriteLine("The {0} color is {1}.",Type,color);
}
private string Type = "chicken";
private string sex = "雄鸡";
}
}
调用:
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Program
{
static void Main(string[] args)
{
Bird bird = new Bird();
Chicken chick = new Chicken();
chick.Color = "red";
chick.ShowType();
chick.ShowColor();
Console.ReadKey();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Program
{
static void Main(string[] args)
{
Bird bird = new Bird();
Chicken chick = new Chicken();
chick.Color = "red";
chick.ShowType();
chick.ShowColor();
Console.ReadKey();
}
}
}
这时候结果很明显
但如果是这样调用呢
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Program
{
static void Main(string[] args)
{
Bird bchick = new Chicken(); //应用了多态特性
Console.WriteLine(bchick.Type);/*执行就近原则:对于同名字段或者方法,编译器是按照其顺序查找来引用的,也就
* 是首先访问离它创建最近的字段或者方法。
* bchick.Type返回的是Bird类中的Type,符合“执行就近原则”,
* 因为bchick是Bird类型,
也就是说bchick的引用类型是Bird,但所创建的对象是Chicken。
*/
bchick.ShowType();/*调用的是Chicken类的ShowType方法,符合“关注对象原则”,因为bchick创建的对象是Chicken,
调用子类还是父类的方法,取决于创建的对象是子类还是父类的对象,而不是它的引用类型。
* 值得注意的是,Chicken中的ShowType方法是重写了父类的ShowType方法,如果没有重写,
* 也就是说没有继承Bird类中的ShowType方法。(去掉override)
* 也因为bchick对象是Bird类型,而不是Chicken类型,
* 根据“不同的类型访问具有不同的访问权限”原则,
* 这时的bchick对象是不可能访问Chicken中的ShowType方法。
* 这时,bchick.ShowType()调用的就会是Bird类中的ShowType方法了。
*/
Console.ReadKey();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承
{
class Program
{
static void Main(string[] args)
{
Bird bchick = new Chicken(); //应用了多态特性
Console.WriteLine(bchick.Type);/*执行就近原则:对于同名字段或者方法,编译器是按照其顺序查找来引用的,也就
* 是首先访问离它创建最近的字段或者方法。
* bchick.Type返回的是Bird类中的Type,符合“执行就近原则”,
* 因为bchick是Bird类型,
也就是说bchick的引用类型是Bird,但所创建的对象是Chicken。
*/
bchick.ShowType();/*调用的是Chicken类的ShowType方法,符合“关注对象原则”,因为bchick创建的对象是Chicken,
调用子类还是父类的方法,取决于创建的对象是子类还是父类的对象,而不是它的引用类型。
* 值得注意的是,Chicken中的ShowType方法是重写了父类的ShowType方法,如果没有重写,
* 也就是说没有继承Bird类中的ShowType方法。(去掉override)
* 也因为bchick对象是Bird类型,而不是Chicken类型,
* 根据“不同的类型访问具有不同的访问权限”原则,
* 这时的bchick对象是不可能访问Chicken中的ShowType方法。
* 这时,bchick.ShowType()调用的就会是Bird类中的ShowType方法了。
*/
Console.ReadKey();
}
}
}
结果是:
原因在上面的注释中给出了。
本人第一次写这种文章,如有问题,请指出与给出贵人的见解,并见谅!