内容提示
1.如何实现继承
2.继承中的构造函数
3.重载、重写、隐藏在继承中是如何实现的
一提到继承我想大家听到最多的估计是--财产继承这个词,财产继承指的是子辈从父辈得到原本属于父辈的财产的所有权和使用权。这里的类所说的继承和这个意思也差不多,当子类继承某个父类的时候拥有了父类的成员,能随时使用父类的成员,但有相关的限制,只有修饰符为public protected这样的成员才会被继承。具体的实现方法是:申明类的时候,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(也就是父类)。下面给具体的例子。
class A
{
int i; //这里没有访问修饰符,但会默认为private
public A()
{
![](/Images/OutliningIndicators/InBlock.gif)
}
public void ShowA()
{
Console.WriteLine("我是父类A");
}
}
class B : A
{
public B()
{
![](/Images/OutliningIndicators/InBlock.gif)
}
public void ShowB()
{
Console.WriteLine("我是父类B");
}
}
![](/Images/OutliningIndicators/None.gif)
class RUN
{
static void Main()
{
B b = new B();
b.ShowA();
b.ShowB();
//int temp = b.i; 这里会产生一个编译错误,因为i没有被继承,所以不能对其访问
}
}
class A
{
public A()
{
Console.WriteLine("我是父类A的构造函数");
}
}
class B : A
{
public B()
{
Console.WriteLine("我是父类B的构造函数");
}
}
![](/Images/OutliningIndicators/None.gif)
class RUN
{
static void Main()
{
B b = new B();
}
}
class A
{
public void Fun1(int i) { }
public void Fun2() { }
public virtual void Fun3() { }
}
class B : A
{
public void Fun1(string i)
{
//对从A类继承过来的方法进行重构
}
public new void Fun2()
{
//隐藏了从A类继承过来的方法,可以通过类型的转换从而调用被隐藏的方法
}
public override void Fun3()
{
//重写了从A类继承过来的方法,无法在调用这个方法,对于要重写的方法在父类中必须使用virtual
}
}
有关继承的东西很多,这些都是基础的,只有把基础的记牢了,才能做更深入的应用。继续努力!ps勉励下自己。![](https://www.cnblogs.com/Emoticons/QQ/14.gif)
1.如何实现继承
2.继承中的构造函数
3.重载、重写、隐藏在继承中是如何实现的
一提到继承我想大家听到最多的估计是--财产继承这个词,财产继承指的是子辈从父辈得到原本属于父辈的财产的所有权和使用权。这里的类所说的继承和这个意思也差不多,当子类继承某个父类的时候拥有了父类的成员,能随时使用父类的成员,但有相关的限制,只有修饰符为public protected这样的成员才会被继承。具体的实现方法是:申明类的时候,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(也就是父类)。下面给具体的例子。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
上面的列子就展示了B类如何继承了A类,并且调用了A类的ShowA()的方法,以及没有被继承的成员。
构造函数的作用是用来初始化对象的,他确保了每个数据成员在使用前都被赋值,防止调用了没有初始化的成员,而产生意想不到的结果。由于类的继承特性,所以在子类的对象在调用父类的数据成员的时候必须确保父类的数据成员被初始化,下面我们就根据一个具体的例子看看C#是如何确保这一点的。我们把上面的例子稍微改一下
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
运行后的结果是:
我是父类A的构造函数
我是父类B的构造函数
由这个结果我们可以推出在实例化子类的时候要先调用父类的构造函数,然后在调用子类的构造函数,这样就确保不会发生没初始化就调用的情况发生。其实大家也可以用VS.NET跟踪一下也可以知道其调用的顺序。
同样是由于继承的原因,在子类还出现了重载、重写和隐藏这三种情况。
重载:继承中的重载和类内的成员方法的重载是一样的,只要在子类中新建了和父类中同名的但参数列表不同的成员方法就重载了父类的成员方法,但前题是要能继承改成员方法。
重写:是在子类中重新改写从父类中继承过来的某个方法,用新的方法代替原有的方法,这里要用关键字virtual override。
隐藏:也是在子类中重新改写从父类中继承过来的某个方法,但不父类的方法替换掉,而是隐藏起来,要用关键字new。
下面给出具体的代码说明如何实现的,具体的为什么要提供这三种机制会在后面的文章讨论。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Emoticons/QQ/14.gif)