惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
S
SegmentFault 最新的问题
Jina AI
Jina AI
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
B
Blog
博客园 - 【当耐特】
博客园 - Franky
M
MIT News - Artificial intelligence
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
LangChain Blog
MyScale Blog
MyScale Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 叶小钗
Last Week in AI
Last Week in AI
Engineering at Meta
Engineering at Meta

博客园 - Nillson

传说中的Singleton.... 设计模式--简单工厂模式 策略模式 抽象类与接口 C# 实现的一个二叉树类 回顾一个面试题 再谈代理 常见的排序方法 预定义,宏定义 连接符,数值运算与函数 复杂查询 数据库中的Index和View的理解 采用递归的方法获得一棵树的所有叶节点 .NET中的新概念整理 4月要看的书 System.Runtime.InteropServices浅见 挂个牛人 一篇关于如何写注释的文章,值得收藏 Vistual Studio 2005到Vistual Studio 2008的版本转换问题 Visual Studio 2008 的一个Bug
重载和重写
Nillson · 2008-06-10 · via 博客园 - Nillson

重载和重写无论在叫法上还是在实际用途上都有容易混淆的地方,写出来自己的理解也有助于区分。
重载发生在同一个类中 这一点很重要。重载主要是针对同一个类中方法名相同但参数(必须的)不同或返回类型(不是必须的)不同的情况。可以参照如下的代码

class OverLoadTest
    
{
        
public void Hello()
        
{
        }

        
public void Hello(string str)
        
{
        }

        
public string Hello()
        
{
        }

    }

在这段代码中有三个具有相同名称的方法Hello,他们彼此之间是重载的关系,注意两点:他们共同存在于一个类中,虽有同样的名字但是执行不同的操作;第一个方法和第三个方法只有返回类型不同,这在C# 中是不允许的,编译器会报出“已定义一个名为"Hello"的方法”的错误。
重写发生在有继承关系的类之间 这一点也很重要。重写发生在派生类上,通过override关键字来改写从其父类继承过来的具有相同返回值,方法名称和参数列表的方法。

    class Program
    
{
        
static void Main(string[] args)
        
{
            OverWriteTestTT owTT 
= new OverWriteTestTT();
            owTT.Hello();
            overWriteTestTTT owTTT 
= new overWriteTestTTT();
            owTTT.Hello();
        }

    }

    
class OverWriteTest
    
{
        
//Over write the method ToString();
        public override string ToString()
        
{
            
return "hello world";
        }

        
//Define a virtual method Hello() to be over written
        public virtual void Hello()
        
{
            Console.WriteLine(
"hello");
        }

    }

    
class OverWriteTestTT : OverWriteTest
    
{
        
//Over write the method Hello() of OverWriteTest
        public override void Hello()
        
{
            Console.WriteLine(
"No hello world");
        }

    }

    
class overWriteTestTTT : OverWriteTestTT
    
{
        
//Over write the method Hello() of class OverWriteTestTT
        public override void Hello()
        
{
            
base.Hello();
            Console.WriteLine(
"NNo hello world");
        }

    }

上面这段代码演示了如何对父类的方法进行重写,需要注意的地方有两点:可以在子类中被重写的方法一定要被标记成virtual(虚拟), abstract(抽象), override(重写)标记为virtual 和abstract 的函数就是为了重写而创建的,标记为override的函数本身是由前两种函数重写而来的,所以它可以被重写也是顺理成章的了;重写的函数必须在子类中出现,而且任何一个父类的函数在其一个子类中只能被重写一次。(这一点很好理解,当你要重写两次时,该子类中将定义两个返回类型,方法名称 和参数列表都相同的函数,这肯定是不可能的)。
所以如果在父类中定义了一个方法habit(),重载讲述的是父亲本人习惯的事,例如爱抽烟爱喝酒等等,但是重写则讲述的是儿子继承父亲习惯的问题,例如父亲抽的是大前门,儿子抽的是中南海,父亲喝的是二锅头,儿子喝得是剑南春了.......