抽象⽅法(abstractmethod)和虚⽅法(virtualmethod),重载
(ov。。。
1. 抽象⽅法 (abstract method)
在抽象类中,可以存在没有实现的⽅法,只是该⽅法必须声明为abstract抽象⽅法。
在继承此抽象类的类中,通过给⽅法加上override关键字来实现此⽅法. 由于该abstract method (抽象⽅法)是没有实现的⽅法,所以在⼦类中必须使⽤override关键字来重写此⽅法
抽象⽅法不提供⾃⾝的实现,并且强制⼦类重写
2. 虚⽅法 (virtual method)
2.1 虚⽅法,⼦类可以选择性重写此⽅法(⽤override关键字重写),也可以不重写. 它不像抽象⽅法,⼦类必须重写(如果⼦类不重写,那么⼦类也必须是抽象类)
2.2 虚⽅法可以有实体,所以可以直接调⽤
public virtual void Vt()
{
Console.WriteLine("this is virtual method");
}
2.3 虚⽅法可以实现多态。⽽抽象⽅法不可以
虚⽅法提供⾃⾝的实现,并且不强制要求⼦类重写
3. 重载应该叫overload, 重写叫override
重载 (overload)某个⽅法是在同⼀个类中发⽣
重写 (override) 就是在⼦类中重写⽗类中的⽅法
3.1 重写(override)是⽤于重写基类的虚⽅法, 这样在派⽣类中提供⼀个新的⽅法
⽗类: public virtual string ToString(){return "a";}
writeline函数⼦类 public override string ToString() {return "b";}
3.2 重载(overload)是提供⼀种机制,相同函数名通过不同的返回值类型以及参数列表来区分的机制
public string ToString(){return "a";}
public string ToString(int id){return id.ToString();}
很明显的区别---函数特征:
重写(override)的两个函数的函数特征相同, 或者说有相同的函数签名
重载(overload)的两个函数的函数名虽然相同,但函数特征不同 (函数特征包括函数名,返回值类型, 参数的类型和个数)。函数签名不同
重写(override):
使⽤override修饰符来修改⽅法,属性,索引器或事件. 重写基⽅法必须与重写⽅法具有相同的签名
不能重写⾮虚⽅法或静态⽅法。重写基⽅法必须是虚拟的,抽象的或重写的. 也就是说,⽤override修饰符重写的基类中的⽅法必须是virtual, abstract或override的⽅法
重载(overload)
当类中包含两个名称相同,但签名不同的⽅法时,发⽣⽅法重载
使⽤重载(overload)⽅法的指南:
a. ⽤⽅法重载来提供在语义上完成相同功能的不同⽅法
b. 使⽤⽅法重载⽽不是允许默认参数。默认参数的版本控制性能不好,因此公共语⾔规范(CLS)中不允许使⽤默认参数。
c. 正确使⽤默认值。在⼀个重载⽅法系列中,复杂⽅法应当使⽤参数名来指⽰从简单⽅法中假定的默认状态发⽣的更改。
d. 对⽅法参数使⽤⼀致的排序和命名模式。提供⼀组重载⽅法,这组重载⽅法带有递增数⽬的参数,以使开发⼈员可以指定想要的级别的信息,这种情况很常见。您指定的参数越多,开发⼈员就可指定得越详细。
e. 如果必须提供重写⽅法的能⼒,请仅使最完整的重载是虚拟的并根据它来定义其他操作。
⽐如下⾯的例⼦,具体解释了这样⼀种模式. 只有最后⼀个⽅法 (参数最完整的⽅法)是虚⽅法,在继承了这个类的⼦类中只要重写(override)这个⽅法就⾏了
public class SampleClass
{
private string myString;
public SampleClass(string str)
{
}
public int IndexOf(string s)
{
return IndexOf (s, 0);
}
public int IndexOf(string s, int startIndex)
{
return IndexOf(s, startIndex, myString.Length - startIndex );
}
public virtual int IndexOf(string s, int startIndex, int count)
{
return myString.IndexOf(s, startIndex, count);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论