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

推荐订阅源

D
Docker
爱范儿
爱范儿
T
The Exploit Database - CXSecurity.com
量子位
T
Tailwind CSS Blog
T
Threatpost
The GitHub Blog
The GitHub Blog
AWS News Blog
AWS News Blog
云风的 BLOG
云风的 BLOG
K
Kaspersky official blog
P
Proofpoint News Feed
博客园 - 司徒正美
L
LangChain Blog
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
S
Secure Thoughts
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
T
Troy Hunt's Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
W
WeLiveSecurity
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
T
Tor Project blog
T
The Blog of Author Tim Ferriss
I
Intezer
P
Privacy & Cybersecurity Law Blog
美团技术团队
N
Netflix TechBlog - Medium
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Vulnerabilities – Threatpost
Application and Cybersecurity Blog
Application and Cybersecurity Blog
G
Google Developers Blog
Attack and Defense Labs
Attack and Defense Labs
T
Tenable Blog
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
A
About on SuperTechFans
Last Week in AI
Last Week in AI

博客园 - 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(),重载讲述的是父亲本人习惯的事,例如爱抽烟爱喝酒等等,但是重写则讲述的是儿子继承父亲习惯的问题,例如父亲抽的是大前门,儿子抽的是中南海,父亲喝的是二锅头,儿子喝得是剑南春了.......