再谈重载与覆写

昨天我在新手区发了一篇《重载还是覆写?》的随笔,后来我发现我犯了一个严重的错误,没有具体说明是.NET 1.1还是2.0,在.NET2.0中由于泛型的出现,对重载和覆写有时候就不能按照1.1下那几个特征去要求。

1.重载(Overload

.NET1.1下,我们定义重载:类中定义的方法可能有不同的版本,它具有如下的特征:

I.           方法名必须相同

II.         参数列表必须不相同,与参数列表的顺序无关

III.       返回值类型可以不相同

示意代码:

None.gifpublic class MyClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public void Write(string _str)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
public void Write(string _str, string _target)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
public bool Write(string _str, string _target, bool _flag)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

.NET2.0下,由于泛型的出现,我们就不能再用这三个特征来判断重载,如下面的两个方法,它们具有相同的方法名,相同的参数列表,相同的返回值,但是它们却可以构成重载:

None.gifpublic class MyClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public void Write<T>(string _str)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
public void Write(string _str)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

再看下面这两个方法,它们不能构成重载,因为如果TU如果实例化时传入相同的类型,则这两个方法就具有相同的签名:

None.gifpublic class MyClass8<T,U>
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public T MyMothed(T a, U b)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return a;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public U MyMothed(U a, T b)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return b;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

但是当我们再添加另外一个方法后,这个类却可以编译通过:

None.gifpublic class MyClass8<T,U>
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public T MyMothed(T a, U b)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return a;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public U MyMothed(U a, T b)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return b;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public int MyMothed(int a, int b)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return a + b;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

通过调用可以发现,优先匹配的方法是一般方法,而非泛型方法。总之,构成重载的第二个特征参数列表必须不同,其实是让方法具有不同的签名,调用程序可以区分,在有泛型时要特别注意,而第一点和第三点仍然适用。

2.覆写(Override

.NET1.1下,对覆写我们的定义是:子类中为满足自己的需要来重复定义某个方法的不同实现,它具有如下特征:

I.           通过使用关键字Override来覆写

II.         只有虚方法和抽象方法直接可以被覆写

III.       相同的方法名

IV.       相同的参数列表

V.         相同的返回值类型

示意代码:

None.gifpublic abstract class BaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public abstract void Write(string _str);
ExpandedBlockEnd.gif}

None.gif
public class SubClass : BaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public override void Write(string _str)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

.NET2.0中,泛型方法的覆写,除了要遵守以上几点外,还应该注意:

在重写定义了泛型参数的虚拟方法时,子类方法必须重新定义该方法特定的泛型参数:

None.gifpublic class MyBaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public virtual void MyMothed<T>(T t)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//dot.gifdot.gif  
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

None.gif
public class MySubClass : MyBaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public override void MyMothed<T>(T t)//重新定义泛型参数T
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
//dot.gifdot.gif 
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

在重写定义了泛型参数的虚拟方法时,子类实现不能重复在基类方法级别出现的约束:

None.gifpublic class MyBaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public virtual void MyMothed<T>(T t) where T : new()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
InBlock.gif        
//dot.gifdot.gif  
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

None.gif
public class MySubClass:MyBaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public override void MyMothed<T>(T t)//不能重复任何约束
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif       
//dot.gifdot.gif 
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/Terrylee/archive/2006/03/10/347104.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值