在说继承前我们来先看一段使用类的继承性的代码:
class A
{
public A()
{
Console.WriteLine("初始化A类");
}
public void prind()
{
Console.WriteLine("A");
}
}
class B:A
{
public B()
{
Console.WriteLine("初始化B类");
}
public void prind()
{
Console.WriteLine("B");
}
}
class C
{
static void Main(string []args)
{
B b=new B();
b.prind();
}
}
输出结果:
初始化A类
初始化B类
B
下面我们来看看A、B、C三个类的对话:
C:A类你运行构造函数,B类你运行构造函数和prind()方法;
A:我为什么要运行构造函数呢?你又没有对我进行实例化;
C:因为B类继承了你,所以你是B类的基类,B类是你的子类;基于基类在子类初始化实例前自动进行初始化的实例,所以你要运行构造函数。
B:虽然我你对我进行了实例化,但我是继承了A类啊,所以不应该运行我的prind()方法啊?应该运行我的父类A的prind方法啊?
C:虽然你是继承了A类,如果你没有实现prind()方法确实是应该运行你的父类A的prind()方法;但你自己实现了prind()方法,所以应该运行你的prind()方法;就像是你继承了你父亲的公司,但又用你父亲公司的名字新开了另一家公司,哪么应该哪家公司是你的呢?这就是同样的道理,你只是继承了你父亲的公司而已,也就是说你可以使用你父亲的公司,但哪家公司不是你的,是你父亲的,而你新开的哪家公司才是你的;所以是运行你的prind()方法。
B:哦,你说我可以使用我的父类的中的方法,哪我应该怎么才能使用它呢?
C:很简单,如果你没有和父类有相同的方法,只要不是你父类自己私有的(private)方法、成员、属性,你直接调用就行;但如果你和父类都有相同名称的方法或者你想要调用父类的方法,中要加上base就行,比如你要用父类的prind()方法:base.prind()。
B:如果我继承多个类哪不就是不用自己实现方法了,只要父类中有就行了?
C:是不行的,类只可以继承一个父类,不能多次继承;但父类可以有多个子类。
B:哪我可以和父类通信吗?
C:可以啊,不过只有带参的构造函数才能进行通信;在你自己的有参构造函数后面加上base(参数),以“:”隔开这样就能通信了,当然你的父类也要有带参的构造函数,不然就不知道是通信给谁父类的哪个成员或属性了。
从A、B、C类的对话中我们可以看出类的继承还有不只是上面代码的这么少东西,哪么接下来我们就来看看base在类的继承中的用法:
class A
{
public A(int i)
{
Console.WriteLine("初始化A类"+i);
}
public void prind()
{
Console.WriteLine("A");
}
private void Sprind()
{
Console.WriteLine("我是A类的私有方法Sprind");
}
}
class B:A
{
public B(int i):base(i)
{
Console.WriteLine("初始化B类"+i);
}
public void prind()
{
Console.WriteLine("B");
}
}
class C
{
static void Main(string []args)
{
B b=new B(1);
base.prind();
base.Sprind();
b.prind();
((A)b).prind();
}
}
输出结果:
初始化A类1
初始化B类1
A
我是A类的私有方法
B
A
对于上面的代码应该都了解,但对于最后一句可能就有疑问了;怎么会输出“A”的呢?b是B类的实例啊?
其实这和数据类型的转换是同一原理,类也要可以转换的,只是它是转换成父类而已。
如果有什么写的不好或不对的欢迎大家指正,谢谢!!!