package example;class m1{ public int getInt() { return 0; }}class m2 extends m1{ public int getInt() { return 1; }}public class Override{ public static void main(String[] args) { m1 m = new m2(); m.getInt(); System.out.println(m.getInt()); }}//输出的是1,说明是调用的是m2的getInt()方法
下面是C#的代码
C# code
namespace test1{ class Override { public int getInt() { return 0; } } class InheritOverride : Override { public int getInt() { return 1; } } class G0 { static void Main() { Override i = new InheritOverride(); int j = i.getInt(); Console.Write(j);//输出的是0,说明调用的是父类的getInt()方法 Console.ReadKey(); } }}疑问:两种语言的重写机制有什么不同吗,C#只有用virtul,abstract,父类的对象才会指向子类的重写方法。而java不是的
[解决办法]
[解决办法] 举个例子: class BaseClass { public virtual void DoSomething(){} }
class SubClass1 : BaseClass { public override void DoSomething(){} }
class SubClass2 : BaseClass { public new void DoSomething(){} }
然后用基类的类型建两个子类的实例 BaseClass object1= new SubClass1() BaseClass object2= new SubClass2()
C#允许派生类中的方法与基类中的方法具有相同的名称 ; 在基类中引入与派生类中的某个成员具有相同名称的新成员在C#中是完全支持的; 这时你必须明确告诉编译器,你希望的操作是怎么样的! // //new 隐藏方法情况 // class MyClass { public void Get() { Console.WriteLine("He is Father"); } } class YourClass :MyClass { public new void Get() //定义了一个与父类同的名方法 而不是实现父类Get() { Console.WriteLine("He is Son"); } } class Program { static void Main() { YourClass y=new YourClass(); y.Get()//He is Son MyClass m=y; m.Get();//He is Father } } 在派生类中,不加new 程序也会成功编译运行,只不过编译器会发出警告,没有关系不用理它,因为当在派生类上 定义有与基类同名的方法时,编译器的默认行为就是隐藏基类的同名成员! // //Virtual 虚方法 重写实现 // class MyClass { public virtual void Get() { Console.WriteLine("He is Father"); } } class YourClass :MyClass { public override void Get() //子类重新实现Get()方法,但此方法的定义是在父类中 { //如果父类此方法不是被虚virtual的或抽象的abstract, Console.WriteLine("He is Son");//不能使用override关键进行重写 } //public new virtual void Get(){} 隐藏
//public new void Get(){} } class Program { static void Main() { YourClass y=new YourClass(); y.Get()//He is Son MyClass m=y; m.Get();//He is Son //输出:相比隐藏情况,调用的是子类的新实现 } } 面象对象编程的重要特性之一,就是继承与多态,C#中的每一种类型都是多态的,而每一种类型的成员组成, 都是拥有(继承)父类上定义的成员与自身定义的成员,如果父类上的成员实现,并不适合自己的需要,子类就有 可能重写(替换实现)父类成员,实现自己的需求!C#语法要求父类成员必须虚的或抽象的,子类才可以重写(替换实现). 如果你不是在子类中重写而是在自身类型上定义了一个与父类同名的方法,此时,就需要new关键来隐藏基类的同名 成员,告诉编译器,这是你所希望的操作!当然,大多数的情况下,我们都是对基类成员进行重写,而不是进行隐藏操作!