日期:2014-05-18  浏览次数:20971 次

c#的方法重写和的java方法重写有什么区别
由于分不够了。只有30分。请教,拜谢
java代码
Java code

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不是的



------解决方案--------------------
探讨
引用:

可以这么说,虽然我写了成千上万行代码,但是印象中还从来没有用过“隐藏成员”,这足以说明这个用法的罕见。然而把隐藏成员当作另一种所谓继承的形式,却是菜鸟,乃至三流学校老师中普遍的流传很广的一个谬误。


真 服 了!!!

虽然说, “把隐藏成员当作另一种所谓继承的形式” 是不对的,但不一定是老师的错! 方法的 隐藏 也算是c# 的一个功能,特性,只是没多大……

------解决方案--------------------
举个例子: 
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() 

object1.DoSomething()调用的是子类Override后的新方法 
object2.DoSomething()调用的仍然是基类的方法


下面是从MSDN拷贝来的:

准则
重写通常用在以下情况下:

您要定义多态性派生类。

您需要安全地让编译器强制执行相同元素类型和调用序列。

隐藏通常用在以下情况下:

您希望可以修改基类并使用您的名称定义元素。

您希望可以随意更改元素类型或调用序列。 




"C#方法隐藏和重写有何区别" 

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 n