有很久没写博客了,最近学C#。哎~说来惭愧,各种语言都学得不精啊,学了C++,学到了一半,现在又转头学其他的。主要是大学课程的安排很不合理(至少我是这么认为的)。没门都没学精,老师讲得都是很基础的,要学精还是要靠自己,而C++完全是自学的。。。
好吧,不多说了,多态的意思是一种事物有多种形态,其实为什么写这个,主要是我想和java进行区别,之前学习java语言,在继承的多态上也花了不少时间,而C#却有点不同,虽然思想都是一样的。但是C#还是有点奇怪的,可能是我看得这本书的问题吧。它是这么描述的:为了使用派生类能更改基类的数据和行为,C#提供了两种选择:一是使用新的派生成员替换基成员,二是重写虚拟的基成员。接下来详细用代码解释下。
1.使用new关键字重新定义类的成员,代码如下:
class A
{
public string doIt()
{
return "调用A类方法";
}
}
class B : A
{
public new string doIt()
{
return "调用B类方法";
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
A a = new B();
Console.WriteLine(b.doIt());
Console.WriteLine(a.doIt());
}
}
代码的输出结果是:
调用B类方法
调用A类方法
分析:这种使用new关键字在派生类中声明与基类同名方法的方法,并不是继承的多态性(书上原话),所以我也有点纳闷,那它还放在继承的多态性来讲,可能是想让读者区别和另外一种的不同吧。因为从上面可以看出,程序只认准了变量的类型,如上面的a变量,它调用了A类的方法,而没有按照多态的原理去调用B类的方法。另外,再说下,如果上面的B类中不使用关键字new,编译也是可以通过的,但是会出现警告的东西。(亲测)好吧,我们看看下面的另外一种情况。
2.用virtual和override关键字定义类成员,代码如下:
class A
{
public virtual string doIt()
{
return "调用A类方法";
}
}
class B : A
{
public override string doIt()
{
return "调用B类方法";
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
A a = new B();
A aa = new A();
Console.WriteLine(b.doIt());
Console.WriteLine(a.doIt());
Console.WriteLine(aa.doIt());
}
}
程序输出结果:
调用B类方法
调用B类方法
调用A类方法
分析:从上面的结果可以看出,这才是继承的多态性。其实和java一样,只是多了两个关键字,virtual和override。
好吧,这次就到这里了,如有什么错误,欢迎各位大牛指出。联系:229047554@qq.com。