} public virtual string getstr() { return "Parent"; } } public class Child:Parent { public Child() { } public new string getstr() { return "Child"; } } public class Test { public Test() { } public static void Main() { Parent p=new Child(); Console.WriteLine(p.getstr()); } } 对于new的情况,显示parent; 对于override的情况,显示child;
小弟总结如下: A a = new A(); 1.隐藏的函数 调用时取决于引用实例的变量类型(等号左边的内容) 2.重写的函数 调用时取决于实例本身的类型(等号右边的内容) 3.可以进行版本控制(这个我没做过) 4.to:jiezhi(風依舊) override后的函数可以使用base.的方法来访问父类中的原函数 new以后的函数不能被使用base.的方法来访问父类中的原函数(好像不对,请看下面的代码)using System; namespace JacCompany { public class MainEntryPoint { public static void Main() { A a = new A(); // A a = new B();// a.Hiddenf(111); a.ReWritef(111); } }
class A { public virtual void ReWritef(int a) //要被重写的方法ReWritef { Console.WriteLine("这是父类A的ReWritef函数,a的值为: "+a); } public void Hiddenf(int a) //要被隐藏的方法Hiddenf { Console.WriteLine("这是父类A的Hiddenf函数,a的值为: "+a); } } class B:A { public override void ReWritef(int a) //开始重写方法ReWritef { base.ReWritef(234); Console.WriteLine("子类B的ReWritef函数,父类A的Hiddenf函数已经被重写!!! a的值的为: "+a); }
public new void Hiddenf(int a) //开始隐藏方法Hiddenf { base.Hiddenf(345);//仍调用被new过后的父类中的函数why? Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a); } } } 请大家指教啊 谢谢
public new void Hiddenf(int a) //开始隐藏方法Hiddenf { base.Hiddenf(345);//仍调用被new过后的父类中的函数why? Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a); }在这个函数中我仍然可以调用被new过后的父类中的函数,why?
就说一遍:做一个抽象类A,有虚方法a(),做类B,C继承于A,在B中重写方法a(),在C中用new隐藏方法a(),然后 B myB = new B();C myC = new C();A myA = myB;A.a();myA = myC;myA.a(); 好了,应该有结论了,~-~
virtual 定义的函数在其子类中必须被重写 new 则不必 用virtual 的话 在函数调用时只能调用子类中重写的函数 而用new则可以在子类中调用被隐藏的函数
to: conan1211(柯楠) 用virtual 的话 在函数调用时只能调用子类中重写的函数这一句好像不对 我依然能调用父类中的virtual的方法啊 就像下面的代码一样,你看我 A a = new a();a.ReWritef(111); //ReWritef可是虚函数啊,我照样能高校父类中的这个虚函数,谢谢大家 多多指教 using System; namespace JacCompany { public class MainEntryPoint { public static void Main() { A a = new A(); a.ReWritef(111); } }
class A { public virtual void ReWritef(int a) //要被重写的方法ReWritef { Console.WriteLine("这是父类A的ReWritef函数,a的值为: "+a); } public void Hiddenf(int a) //要被隐藏的方法Hiddenf { Console.WriteLine("这是父类A的Hiddenf函数,a的值为: "+a); } } class B:A { public override void ReWritef(int a) //开始重写方法ReWritef { base.ReWritef(234); Console.WriteLine("子类B的ReWritef函数,父类A的Hiddenf函数已经被重写!!! a的值的为: "+a); }
public new void Hiddenf(int a) //开始隐藏方法Hiddenf { base.Hiddenf(345);//仍调用被new过后的父类中的函数why? Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a); } } }
此外new还可以重写非virtual函数
这是面向对向语言多态的基础。你可以用一个基类的指针访问各个对象的virtual 方法。一般方法隐藏跟变量隐藏是一样的。
而new就比较随便了——当然,有时候,多加、少加一个new,它会警告你! 我觉得,new关键字,是给程序员自己看的,没有其他意义,只是说明,基类有过这个东西而已!和全局变量被局部屏蔽一样,只不过是基类函数,被派生类函数屏蔽了而已!
当然,还可以用base.*的方法,去访问基类函数的!
override是多态,而new 是一个新的方法。
{
public Parent()
{
}
public virtual string getstr() {
return "Parent";
}
}
public class Child:Parent
{
public Child()
{ }
public new string getstr() {
return "Child";
} }
public class Test
{
public Test()
{ }
public static void Main() {
Parent p=new Child();
Console.WriteLine(p.getstr());
}
}
对于new的情况,显示parent;
对于override的情况,显示child;
A a = new A();
1.隐藏的函数 调用时取决于引用实例的变量类型(等号左边的内容)
2.重写的函数 调用时取决于实例本身的类型(等号右边的内容)
3.可以进行版本控制(这个我没做过)
4.to:jiezhi(風依舊)
override后的函数可以使用base.的方法来访问父类中的原函数 new以后的函数不能被使用base.的方法来访问父类中的原函数(好像不对,请看下面的代码)using System;
namespace JacCompany
{
public class MainEntryPoint
{
public static void Main()
{
A a = new A();
// A a = new B();// a.Hiddenf(111);
a.ReWritef(111); }
}
class A
{
public virtual void ReWritef(int a) //要被重写的方法ReWritef
{
Console.WriteLine("这是父类A的ReWritef函数,a的值为: "+a);
} public void Hiddenf(int a) //要被隐藏的方法Hiddenf
{
Console.WriteLine("这是父类A的Hiddenf函数,a的值为: "+a);
}
} class B:A
{
public override void ReWritef(int a) //开始重写方法ReWritef
{
base.ReWritef(234);
Console.WriteLine("子类B的ReWritef函数,父类A的Hiddenf函数已经被重写!!! a的值的为: "+a);
}
public new void Hiddenf(int a) //开始隐藏方法Hiddenf
{
base.Hiddenf(345);//仍调用被new过后的父类中的函数why?
Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a);
}
}
}
请大家指教啊 谢谢
{
base.Hiddenf(345);//仍调用被new过后的父类中的函数why?
Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a);
}在这个函数中我仍然可以调用被new过后的父类中的函数,why?
我觉得,new关键字,是给程序员自己看的,没有其他意义,只是说明,基类有过这个东西而已!和全局变量被局部屏蔽一样,只不过是基类函数,被派生类函数屏蔽了而已!
当然,还可以用base.*的方法,去访问基类函数的! new的作用,只是给程序员一点提醒而已,好像既不会起到动态联编的作用,又不会起到完全屏蔽基类的作用!
所以它多加一个,少加一个,都一样可以通过编译——比如你基类,没有子类同样的函数,你一样可以加个new字的,而如果你基类有和子类同样的函数,你也同样可以不加new字的! 不知我的见解是否有错,请高手指教!
好了,应该有结论了,~-~
new 则不必
用virtual 的话 在函数调用时只能调用子类中重写的函数
而用new则可以在子类中调用被隐藏的函数
就像下面的代码一样,你看我 A a = new a();a.ReWritef(111); //ReWritef可是虚函数啊,我照样能高校父类中的这个虚函数,谢谢大家 多多指教
using System;
namespace JacCompany
{
public class MainEntryPoint
{
public static void Main()
{
A a = new A();
a.ReWritef(111); }
}
class A
{
public virtual void ReWritef(int a) //要被重写的方法ReWritef
{
Console.WriteLine("这是父类A的ReWritef函数,a的值为: "+a);
} public void Hiddenf(int a) //要被隐藏的方法Hiddenf
{
Console.WriteLine("这是父类A的Hiddenf函数,a的值为: "+a);
}
} class B:A
{
public override void ReWritef(int a) //开始重写方法ReWritef
{
base.ReWritef(234);
Console.WriteLine("子类B的ReWritef函数,父类A的Hiddenf函数已经被重写!!! a的值的为: "+a);
}
public new void Hiddenf(int a) //开始隐藏方法Hiddenf
{
base.Hiddenf(345);//仍调用被new过后的父类中的函数why?
Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a);
}
}
}