c# – 为什么我将class2的引用放入class1的对象?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么我将class2的引用放入class1的对象?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1972字,纯文字阅读大概需要3分钟。
内容图文
![c# – 为什么我将class2的引用放入class1的对象?](/upload/InfoBanner/zyjiaocheng/793/48614bd999f742c5be8f7e4513159502.jpg)
好的,所以我遇到了这段代码:
class1 a = new class1();
a.Test();
class1 b = new class2();
b.Test();
它与虚拟和覆盖有关,但我现在的问题是:
为何选择
class1 b = new class2();
什么时候你可以打字
class2 b = new class2();
因为两种解决方案都有相同的输出
解决方法:
在方法上使用“new”关键字而不是“覆盖”的派生类将根据其投射方式而有所不同.
例:
class Class1
{
public virtual void DoSomething
{
Console.WriteLine("Class1.DoSomething");
}
}
class Class2 : Class1
{
public new void DoSomething
{
Console.WriteLine("Class2.DoSomething");
}
}
class Class3 : Class1
{
public override void DoSomething
{
Console.WriteLine("Class3.DoSomething");
}
}
类2和3派生自类1,但类2使用’new’关键字来“隐藏”类1的虚拟成员,而类3使用’override’关键字来“覆盖”类1的虚拟成员.当你在他们自己的类型的幌子下使用这些类时会发生什么:
Class1 one = new Class1();
one.DoSomething(); // outputs "Class1.DoSomething"
Class2 two = new Class2();
two.DoSomething(); // outputs "Class2.DoSomething"
Class3 three = new Class3();
three.DoSomething(); // outputs "Class3.DoSomething"
它们都按预期输出正确的类名.但是当你在第1类的幌子下使用这些类时会发生这种情况:
Class1 one = new Class1();
one.DoSomething(); // outputs "Class1.DoSomething"
Class1 two = new Class2();
two.DoSomething(); // outputs "Class1.DoSomething"
Class1 three = new Class3();
three.DoSomething(); // outputs "Class3.DoSomething"
因为class 2’隐藏’了这个方法,所以当它用作自己的类型时会输出’Class2.DoSomething’,但是当它用作它的基类型时它会输出’Class1.DoSomething’.但是因为类3’覆盖’了该方法,所以它将输出’Class3.DoSomething’,无论它是用作自己的类型还是基类型 – 因为它’覆盖’基类型的功能.
(另一个影响是,如果Class2或Class3有一个额外的方法,比如DoSomethingElse,你将无法调用Class1 two = new Class2(); two.DoSomethingElse()因为Class1没有该方法.)
我不知道任何现实世界的用例,但它就在那里,这是我能想到的唯一方法,使用Class1 class2 = new Class2()将提供任何实际用途.如果Class2没有“隐藏”Class1的任何成员,那么就没有真正的好处.
见:http://msdn.microsoft.com/en-us/library/ms173153.aspx
内容总结
以上是互联网集市为您收集整理的c# – 为什么我将class2的引用放入class1的对象?全部内容,希望文章能够帮你解决c# – 为什么我将class2的引用放入class1的对象?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。