再談重載與覆寫
昨天我在新手區發了一篇《重載還是覆寫?》的隨筆,后來我發現我犯了一個嚴重的錯誤,沒有具體說明是.NET 1.1還是2.0,在.NET2.0中由于泛型的出現,對重載和覆寫有時候就不能按照1.1下那幾個特征去要求。
1.重載(Overload)
在.NET1.1下,我們定義重載:類中定義的方法可能有不同的版本,它具有如下的特征:
I. 方法名必須相同
II. 參數列表必須不相同,與參數列表的順序無關
III. 返回值類型可以不相同
示意代碼:
public class MyClass
{
public void Write(string _str)
{
//

}
public void Write(string _str, string _target)
{
//

}
public bool Write(string _str, string _target, bool _flag)
{
//

}
}在.NET2.0下,由于泛型的出現,我們就不能再用這三個特征來判斷重載,如下面的兩個方法,它們具有相同的方法名,相同的參數列表,相同的返回值,但是它們卻可以構成重載:
public class MyClass
{
public void Write<T>(string _str)
{
//

}
public void Write(string _str)
{
//

}
}再看下面這兩個方法,它們不能構成重載,因為如果T,U如果實例化時傳入相同的類型,則這兩個方法就具有相同的簽名:
public class MyClass8<T,U>
{
public T MyMothed(T a, U b)
{
return a;
}
public U MyMothed(U a, T b)
{
return b;
}
}但是當我們再添加另外一個方法后,這個類卻可以編譯通過:
public class MyClass8<T,U>
{
public T MyMothed(T a, U b)
{
return a;
}
public U MyMothed(U a, T b)
{
return b;
}
public int MyMothed(int a, int b)
{
return a + b;
}
}通過調用可以發現,優先匹配的方法是一般方法,而非泛型方法。總之,構成重載的第二個特征參數列表必須不同,其實是讓方法具有不同的簽名,調用程序可以區分,在有泛型時要特別注意,而第一點和第三點仍然適用。
2.覆寫(Override)
在.NET1.1下,對覆寫我們的定義是:子類中為滿足自己的需要來重復定義某個方法的不同實現,它具有如下特征:
I. 通過使用關鍵字Override來覆寫
II. 只有虛方法和抽象方法直接可以被覆寫
III. 相同的方法名
IV. 相同的參數列表
V. 相同的返回值類型
示意代碼:
public abstract class BaseClass
{
public abstract void Write(string _str);
}
public class SubClass : BaseClass
{
public override void Write(string _str)
{
//

}
}在.NET2.0中,泛型方法的覆寫,除了要遵守以上幾點外,還應該注意:
在重寫定義了泛型參數的虛擬方法時,子類方法必須重新定義該方法特定的泛型參數:
public class MyBaseClass
{
public virtual void MyMothed<T>(T t)
{
//
}
}
public class MySubClass : MyBaseClass
{
public override void MyMothed<T>(T t)//重新定義泛型參數T
{
//
}
}在重寫定義了泛型參數的虛擬方法時,子類實現不能重復在基類方法級別出現的約束:
public class MyBaseClass
{
public virtual void MyMothed<T>(T t) where T : new()
{
//
}
}
public class MySubClass:MyBaseClass
{
public override void MyMothed<T>(T t)//不能重復任何約束
{
//
}
}Worktile,新一代簡單好用、體驗極致的團隊協同、項目管理工具,讓你和你的團隊隨時隨地一起工作。完全免費,現在就去了解一下吧。
https://worktile.com


浙公網安備 33010602011771號