C#中面向對象編程機制之多態進修筆記。本站提示廣大學習愛好者:(C#中面向對象編程機制之多態進修筆記)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中面向對象編程機制之多態進修筆記正文
C#的多態性:
我的懂得是:統一個操作,感化於分歧的對象時,會有分歧的成果,即統一個辦法依據須要,感化於分歧的對象時,會有分歧的完成。
C#的多態包含:接口多態,繼續多態。
個中繼續多態又包含經由過程虛擬辦法完成的多態和經由過程籠統辦法完成的多態性
例如:基類植物都有吃的辦法,然則分歧的植物吃的器械就會紛歧樣,例如狼吃肉,羊吃草,如許“吃”的這個辦法就要在派生類外面從新完成以下,運轉時,經由過程指向基類的指針,來挪用完成派生類中的辦法。
接上去舉例完成多態性。
1. 接口多態性
把植物“吃”的辦法放到一個接口(IAnimal)裡,然後讓詳細的植物類(Wolf/Sheep)繼續這個接口,並依據本身的須要完成這個接口。
代碼完成:
class Program {
static void Main(string[] args) {
new Wolf().Eat();
new Sheep().Eat();
}
}
public class Wolf : IAnimal {
//多態完成
public void Eat() {
Console.WriteLine("狼吃肉!");
}
}
public class Sheep : IAnimal {
//多態完成
public void Eat() {
Console.WriteLine("羊吃草!");
}
}
//接口
public interface IAnimal {
void Eat();
}
接口的多態性就是當分歧的類繼續了雷同的接口今後,都要依據本身的須要從新完成繼續的接口,如許異樣的辦法簽名在分歧的類中就會完成分歧的操作。
2. 繼續的多態性
2.1.經由過程虛擬辦法完成的多態(virtual,override)
起首要在基類中完成virtual辦法,然後在派生類中依據本身的須要用override重寫virtual辦法。假如不願望這個辦法被持續重寫,則把這個辦法寫成sealed辦法。
virtual辦法必需在基類中完成。
代碼完成:
class Program {
static void Main(string[] args) {
new Wolf().Eat();
new Sheep().Eat();
new Goat().Eat();
}
}
public class Wolf : Animal {
//多態完成
public override void Eat() {
base.Eat();
Console.WriteLine("狼吃肉!");
}
}
public class Sheep : Animal {
//多態完成
public override void Eat() {
base.Eat();
Console.WriteLine("羊吃草!");
}
}
public class Goat : Sheep {
//多態完成被終結,此Eat辦法不克不及被override,由於用sealed了
public sealed override void Eat() {
//base.Eat();
Console.WriteLine("山羊吃草!");
}
}
//基類完成虛辦法
public class Animal {
public virtual void Eat() { }
}
2.2.經由過程籠統辦法完成的多態(abstract,override)
籠統辦法必需界說在籠統類裡。籠統類不克不及被創立實例。
基類中的籠統辦法只能被聲明,不須要完成,所以派生類中重寫籠統辦法的時刻沒有base辦法。
代碼完成以下:
class Program {
static void Main(string[] args) {
new Wolf().Eat();
new Sheep().Eat();
new Goat().Eat();
}
}
public class Wolf : Animal {
//多態完成
public override void Eat() {
Console.WriteLine("狼吃肉!");
}
}
public class Sheep : Animal {
//多態完成
public override void Eat() {
Console.WriteLine("羊吃草!");
}
}
public class Goat : Sheep {
//多態完成被終結,此Eat辦法不克不及被override,由於用sealed了
public sealed override void Eat() {
Console.WriteLine("山羊吃草!");
}
}
//基類只需聲明辦法
public abstract class Animal {
public abstract void Eat();
}
總結:
1.虛辦法重寫的時刻可以有base辦法(base.Eat()),籠統辦法重寫的時刻沒有base辦法,緣由是:虛辦法必需在基類中完成,籠統辦法只在基類中聲明,不須要完成。
2.派生類中可以 不重寫虛辦法的完成,然則派生類必需重寫籠統辦法的完成,緣由同1.
3.包括虛辦法的非籠統類可以被創立實例(對象),然則包括籠統辦法的籠統類不克不及被創立實例。
4.繼續接口的派生類必需完成接口的辦法,由於接口也是只擔任聲明辦法,不擔任完成。
5.接口的多態性不須要用override重寫辦法。
pings. * @param handler the handler object to validate * @param request current HTTP request * @throws Exception if validation failed */ protected void validateHandler(Object handler, HttpServletRequest request) throws Exception { }封裝handler為HandlerExecutionChain,並添加PathExposingHandlerInterceptor和UriTemplateVariablesHandlerInterceptor攔阻器.
/** * Build a handler object for the given raw handler, exposing the actual * handler, the {@link #PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE}, as well as * the {@link #URI_TEMPLATE_VARIABLES_ATTRIBUTE} before executing the handler. * <p>The default implementation builds a {@link HandlerExecutionChain} * with a special interceptor that exposes the path attribute and uri template variables * @param rawHandler the raw handler to expose * @param pathWithinMapping the path to expose before executing the handler * @param uriTemplateVariables the URI template variables, can be {@code null} if no variables found * @return the final handler object */ protected Object buildPathExposingHandler(Object rawHandler, String bestMatchingPattern, String pathWithinMapping, Map<String, String> uriTemplateVariables) { HandlerExecutionChain chain = new HandlerExecutionChain(rawHandler); chain.addInterceptor(new PathExposingHandlerInterceptor(bestMatchingPattern, pathWithinMapping)); if (!CollectionUtils.isEmpty(uriTemplateVariables)) { chain.addInterceptor(new UriTemplateVariablesHandlerInterceptor(uriTemplateVariables)); } return chain; }
以上內容是小編給年夜家引見的SpringMVC源碼解讀之HandlerMapping - AbstractUrlHandlerMapping系列request分發的相干常識,願望對年夜家有所贊助!