MyException - 我的异常网
当前位置:我的异常网» C# » c#的方法重写和的java方法重写有什么区别,该怎么解决

c#的方法重写和的java方法重写有什么区别,该怎么解决

www.MyException.Cn  网友分享于:2013-04-27  浏览:14次
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 new virtual void Get(){} 隐藏 

文章评论

为什么程序员都是夜猫子
为什么程序员都是夜猫子
中美印日四国程序员比较
中美印日四国程序员比较
Java程序员必看电影
Java程序员必看电影
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
鲜为人知的编程真相
鲜为人知的编程真相
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员的鄙视链
程序员的鄙视链
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
那些争议最大的编程观点
那些争议最大的编程观点
代码女神横空出世
代码女神横空出世
我是如何打败拖延症的
我是如何打败拖延症的
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
一个程序员的时间管理
一个程序员的时间管理
如何成为一名黑客
如何成为一名黑客
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
旅行,写作,编程
旅行,写作,编程
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
老程序员的下场
老程序员的下场
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
漫画:程序员的工作
漫画:程序员的工作
我的丈夫是个程序员
我的丈夫是个程序员
10个调试和排错的小建议
10个调试和排错的小建议
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
编程语言是女人
编程语言是女人
 程序员的样子
程序员的样子
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员必看的十大电影
程序员必看的十大电影
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员都该阅读的书
程序员都该阅读的书
总结2014中国互联网十大段子
总结2014中国互联网十大段子
每天工作4小时的程序员
每天工作4小时的程序员
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有