威尼斯人线上娱乐

【威尼斯人线上娱乐】虚方法达成多态,说来也说

20 4月 , 2019  

本文版权归微博和小编刘亚辉自己共同持有。接待转发,转发和爬虫请注脚原来的小说地址 

C#多态“说来也说”——逻辑层BLL中的多态使用,

正文版权归果壳网和笔者张宇彤本身共同具备。应接转发,转发和爬虫请注解原来的书文地址 

前天早晨,有个对象说学了漫漫,依旧没搞懂多态,让自家轻易解说一下。小编感到多态在面向多想的三大特点在那之中,算是最简易的,最难的是近乎轻巧的包裹。在编写面向对象代码时,如何让代码可读性更加强,除了变量和艺术命名标准外,要做的到三个方式只做一件职业,那样的想想是《代码整洁之道》壹书中关键爱慕的思辨,其实有经历的诸位都指望团结看来的代码是回顾,可保证,可读性强的,相信大家也都“有幸”蒙受过几百上千行的代码,更过分的是有个对象已经维护一个上万行的Action,夸张的说,调节和测试并走通逻辑,一遍要四天,有的人说那是工作逻辑不断加多所产生,但本身感觉,在那种情况下,更应当尽或然做到贰个格局做1件事情。笔者也不多作弄了,关于代码整洁,我在大叁的时候,就”嘲笑”过

打包也不是明天的宗旨,今日大家要说的是多态,在爱人问作者的时候,作者给她举了上面那几个差不多的例子。

壹体化归纳这一个事例来讲正是在宗旨的三层架构个中,DAL层建五个类AdminDal,UserDal。多个类中,都有扩充对象和删除对象地点法,这那个时候,大家相应给多个类华而不实出贰个父类BaseDal<T>,父类中是他们的公物艺术,并且父类需求二个泛型T,那样父类的主意,本领领略您所要增添可能去除的object到底是如何类型的。请看如下代码。尽管五个类的集体艺术在父类个中,不过他们本人特有的不2诀窍,依旧要写在和煦的Dal层在那之中。

1   public class UserDal: BaseDal<UserEntity>
2   {
3         
4   }

1   public class AdminDal: BaseDal<AdminEntity>
2     {
3         public void Manage()
4         {
5             Console.WriteLine("管理员管理网站");
6         }
7     }

 1 public class BaseDal<T>
 2     {
 3         public void AddObj(T obj)
 4         {
 5             Console.WriteLine("添加对象成功,对象属于"+obj.GetType().ToString());
 6         }
 7 
 8         public void DeleteObj(T obj)
 9         {
10             Console.WriteLine("删除对象成功,对象属于"+obj.GetType().ToString());
11         }
12 
13     }

 上边给出逻辑层代码,倘使说普通的开销进程个中,你的代码也许是这么的。

 1  public class UserBll 
 2     {
 3         UserDal dal = new UserDal();
 4 
 5         public void Add(UserEntity obj)
 6         {
 7             dal.AddObj(obj);
 8         }
 9 
10         public void Delete(UserEntity obj)
11         {
12             dal.DeleteObj(obj);
13         }
14      }

    public class AdminBll 
    {
        AdminDal dal = new AdminDal();

        public void Add(AdminEntity admin)
        {
            dal.AddObj(admin);
        }
        public void Delete(AdminEntity admin)
        {
            dal.DeleteObj(admin);
        }

        public void Manage()
        {
            dal.Manage();
        }
     }

也等于在分其他逻辑层个中,调用dal层。那年你又见到如故有如此多种复的代码,是或不是相应再度封装成三个BaseBll<T>呢。答案是确定的,可是难点又来了,在包装父类的进度中,你会开掘,那么些dal的靶子怎么封装呢?那正是用到多态的关键点。上边看一下BaseBll.cs的代码。

 public abstract class BaseBll<T> where T:class, new()
    {
        public BaseDal<T> currentDal;

        public BaseBll()
        {
            SetCurrentDal();
        }

        public abstract void SetCurrentDal();


        public void BaseAdd(T obj)
        {
            currentDal.AddObj(obj);
        }

        public void BaseDelete(T obj)
        {
            currentDal.DeleteObj(obj);
        }

    }

自个儿给了多个浮泛的基类,并且付诸抽象的SetCurrentDal的虚幻方法定义。该方法用于安装当前类的currentDal到底是adminDal依旧userDal。大家在构造函数中调用SetCurrentDal这一个抽象方法,为啥在构造函数中调用的来头是,当实例化子类对象时,一定是率先进入其父类的构造函数。当子类AdminBll和UserBll继承BaseBll<T>的时候,必须重写抽象方法,并且为BaseDal<T>
currentDal对象设置实际的值。俺先给出子类的代码

 1 public class AdminBll : BaseBll<AdminEntity>
 2     {
 3         AdminDal dal = new AdminDal();
 4         public AdminBll()
 5         {
 6 
 7         }
 8         public void Manage()
 9         {
10             new AdminDal().Manage();
11         }
12 
13         public override void SetCurrentDal()
14         {
15             currentDal = new AdminDal();
16         }
17     }

1 public class UserBll : BaseBll<UserEntity>
2     {
3         public override void SetCurrentDal()
4         {
5             base.currentDal = new UserDal();
6         }
7     }

当实例化子类的对象时,进程为:子类构造函数(不进来)—进入父类构造函数—父类构造内部调用子类重写的SetCurrentDal(当前多态的currentDal到底是什么人的实例)—父类构造试行实现(设置currentDal完毕)—子类构造函数。那就是抽象方法落成的多态。

【威尼斯人线上娱乐】虚方法达成多态,说来也说。上边在UI层调用一下,看看结果:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             AdminBll adminBll = new AdminBll();
 6             AdminEntity admin = new AdminEntity() {AdminName="吴双",AdminPwd="123" };
 7             adminBll.Manage();
 8             adminBll.BaseAdd(admin);
 9             Console.ReadKey();
10         }
11     }

输出结果:

威尼斯人线上娱乐 1

 

在支付的进度中,恐怕你会有诸多实体类,每一个实体类都有独家的增加和删除改查等其它共有方法,基于那样的情形,大家就供给一手来将其卷入。为啥在逻辑层使用了多态,原因正是大家封装父类的时候,不分明当前的currentDal到底是adminDal依然userDal还是xxxDal。为了封装出基类,那一个多态的目的就必需了。

理所当然在事实上个中,假若你是写原生sql,那样封装的确不轻松,种种拼接sql。但若是说你用OENVISIONM框架,EF,Dapper之类的,那么些点子真的是至关重要的,你可能再加上接口层,加上中国人民解放军海军工程大学业作单元,成立对象非new,使用抽象工厂,重视注入等。无论怎么样,那壹层的多态一定能用到,只是创造对象稍作修改。

 

下1阶段也筹算实行后台架构搭建分享,MVC
WebApi+EF/Dapper+工作单元+抽象工厂/注重注入Autofac+AutoMapper+日志组件等。

自作者也曾数次在品种中搭建此类框架,在缓存进步品质,管理高并发,应用服务器集群,缓存集群,队列集群等地点,此番也会进入到分享个中。

 

要是前天的点滴分享,对你有点滴协助,请点赞帮助,也为投机的升高点赞。

点击下方关切,大家共同升高。

 

本文版权归腾讯网和小编李军本人共同享有。应接转发,转发和爬虫请注脚原作地址
ht…

本文版权归新浪和小编刘瑞芳自身共同持有。迎接转发,转发和爬虫请表明原来的书文地址 

一.虚办法提供一种默许落成,子类能够选用是不是重写,假如不重写,那么就采取父类已经达成的不贰秘技。(重写能够更改方法的指针)

前几天上午,有个对象说学了久久,照旧没搞懂多态,让我差不离讲明一下。笔者认为多态在面向多想的三大特点个中,算是最简便的,最难的是看似轻易的卷入。在编排面向对象代码时,咋样让代码可读性越来越强,除了变量和艺术命名标准外,要做的到二个格局只做1件工作,这样的思虑是《代码整洁之道》一书中至关心珍视要重申的思维,其实有经历的诸位都指望本身看出的代码是回顾,可体贴,可读性强的,相信我们也都“有幸”境遇过几百上千行的代码,更过分的是有个对象曾经维护2个上万行的Action,夸张的说,调节和测试并走通逻辑,1遍要四天,有的人说这是业务逻辑不断加码所导致,但自己认为,在这种场合下,更应该尽量做到二个办法做一件业务。小编也不多作弄了,关于代码整洁,小编在大叁的时候,就”吐槽”过。

今日午夜,有个对象说学了许久,依然没搞懂多态,让自家归纳讲授一下。小编觉得多态在面向多想的三大特征其中,算是最轻巧易行的,最难的是近乎轻松的包装。在编辑面向对象代码时,怎么着让代码可读性越来越强,除了变量和方法命名标准外,要做的到2个办法只做一件业务,这样的思念是《代码整洁之道》1书中根本重视的考虑,其实有经验的诸位都梦想团结看到的代码是简轻松单,可保证,可读性强的,相信大家也都“有幸”蒙受过几百上千行的代码,更过分的是有个朋友曾经维护2个上万行的Action,夸张的说,调节和测试并走通逻辑,贰遍要三日,有的人说那是业务逻辑不断充实所导致,但我以为,在那种情形下,更应该尽量做到四个方法做一件业务。笔者也不多作弄了,关于代码整洁,作者在大三的时候,就”戏弄”过。

1经急需改动类型指针,那么必要做方法的重写:

装进也不是今日的核心,今天我们要说的是多态,在情侣问作者的时候,笔者给他举了上面那些差不多的事例。

包装也不是今天的宗旨,明日大家要说的是多态,在对象问小编的时候,小编给他举了下边那几个轻便的事例。

一.万一子类方法是重写方法,那么系统会扫描父类方法中,有未有平等具名的可重写方法,如若未有就报错。

全部归纳那些例子来讲就是在着力的三层架构当中,DAL层建两个类AdminDal,UserDal。七个类中,都有增添对象和删除对象地点法,那那一年,我们理应给五个类华而不实出二个父类BaseDal<T>,父类中是他俩的共用艺术,并且父类须要八个泛型T,这样父类的形式,本领通晓您所要加多或许去除的object到底是什么样类型的。请看如下代码。尽管五个类的国有措施在父类当中,但是她们作者特有的主意,照旧要写在和睦的Dal层在那之中。

威尼斯人线上娱乐 ,完整回顾这几个例子来讲就是在主导的三层框架结构当中,DAL层建八个类AdminDal,UserDal。多个类中,都有增添对象和删除对象地方法,那那年,我们应有给多少个类华而不实出四个父类BaseDal<T>,父类中是她们的国有措施,并且父类供给二个泛型T,那样父类的方法,技巧驾驭你所要加多也许去除的object到底是何许项目标。请看如下代码。就算八个类的公家措施在父类个中,不过她们本身特有的诀要,照旧要写在融洽的Dal层在那之中。

二.只要父类方法是虚方法,那么子类能够挑选是不是重写,尽管重写,就会调用子类的重写方法,完结多态;如若未有重写,就会选择父类已经得以达成的法门。

1   public class UserDal: BaseDal<UserEntity>
2   {
3         
4   }

1   public class AdminDal: BaseDal<AdminEntity>
2     {
3         public void Manage()
4         {
5             Console.WriteLine("管理员管理网站");
6         }
7     }

 1 public class BaseDal<T>
 2     {
 3         public void AddObj(T obj)
 4         {
 5             Console.WriteLine("添加对象成功,对象属于"+obj.GetType().ToString());
 6         }
 7 
 8         public void DeleteObj(T obj)
 9         {
10             Console.WriteLine("删除对象成功,对象属于"+obj.GetType().ToString());
11         }
12 
13     }
1   public class UserDal: BaseDal<UserEntity>
2   {
3         
4   }

1   public class AdminDal: BaseDal<AdminEntity>
2     {
3         public void Manage()
4         {
5             Console.WriteLine("管理员管理网站");
6         }
7     }

 1 public class BaseDal<T>
 2     {
 3         public void AddObj(T obj)
 4         {
 5             Console.WriteLine("添加对象成功,对象属于"+obj.GetType().ToString());
 6         }
 7 
 8         public void DeleteObj(T obj)
 9         {
10             Console.WriteLine("删除对象成功,对象属于"+obj.GetType().ToString());
11         }
12 
13     }

三.贯彻多态必要完成情势的重写

 上面给出逻辑层代码,假使说普通的费用进度个中,你的代码也许是那样的。

 上面给出逻辑层代码,若是说普通的开支进程个中,你的代码可能是这么的。

三.落成重写得得以达成类的继续

 1  public class UserBll 
 2     {
 3         UserDal dal = new UserDal();
 4 
 5         public void Add(UserEntity obj)
 6         {
 7             dal.AddObj(obj);
 8         }
 9 
10         public void Delete(UserEntity obj)
11         {
12             dal.DeleteObj(obj);
13         }
14      }

    public class AdminBll 
    {
        AdminDal dal = new AdminDal();

        public void Add(AdminEntity admin)
        {
            dal.AddObj(admin);
        }
        public void Delete(AdminEntity admin)
        {
            dal.DeleteObj(admin);
        }

        public void Manage()
        {
            dal.Manage();
        }
     }
 1  public class UserBll 
 2     {
 3         UserDal dal = new UserDal();
 4 
 5         public void Add(UserEntity obj)
 6         {
 7             dal.AddObj(obj);
 8         }
 9 
10         public void Delete(UserEntity obj)
11         {
12             dal.DeleteObj(obj);
13         }
14      }

    public class AdminBll 
    {
        AdminDal dal = new AdminDal();

        public void Add(AdminEntity admin)
        {
            dal.AddObj(admin);
        }
        public void Delete(AdminEntity admin)
        {
            dal.DeleteObj(admin);
        }

        public void Manage()
        {
            dal.Manage();
        }
     }

多态的选取:申明父类变量,实例化子类对象。

也正是在分其余逻辑层在那之中,调用dal层。那年你又来看依然有这么多种复的代码,是还是不是相应再一次封装成三个BaseBll<T>呢。答案是断定的,不过难点又来了,在包装父类的进程中,你会意识,那些dal的对象怎么封装呢?那正是用到多态的关键点。上面看一下BaseBll.cs的代码。

也等于在分级的逻辑层个中,调用dal层。这一年你又见到照旧有这么多种复的代码,是否相应重新封装成一个BaseBll<T>呢。答案是必然的,不过难点又来了,在卷入父类的长河中,你会意识,那几个dal的靶子怎么封装呢?那正是用到多态的关键点。上边看一下BaseBll.cs的代码。

多态:一种操作,多种响应。

 public abstract class BaseBll<T> where T:class, new()
    {
        public BaseDal<T> currentDal;

        public BaseBll()
        {
            SetCurrentDal();
        }

        public abstract void SetCurrentDal();


        public void BaseAdd(T obj)
        {
            currentDal.AddObj(obj);
        }

        public void BaseDelete(T obj)
        {
            currentDal.DeleteObj(obj);
        }

    }
 public abstract class BaseBll<T> where T:class, new()
    {
        public BaseDal<T> currentDal;

        public BaseBll()
        {
            SetCurrentDal();
        }

        public abstract void SetCurrentDal();


        public void BaseAdd(T obj)
        {
            currentDal.AddObj(obj);
        }

        public void BaseDelete(T obj)
        {
            currentDal.DeleteObj(obj);
        }

    }

 

自个儿给了贰个架空的基类,并且付诸抽象的SetCurrentDal的肤浅方法定义。该方法用于安装当前类的currentDal到底是adminDal还是userDal。大家在构造函数中调用SetCurrentDal那么些抽象方法,为啥在构造函数中调用的原故是,当实例化子类对象时,一定是率先进入其父类的构造函数。当子类AdminBll和UserBll承袭BaseBll<T>的时候,必须重写抽象方法,并且为BaseDal<T>
currentDal对象设置实际的值。小编先给出子类的代码

本身给了贰个华而不实的基类,并且付诸抽象的SetCurrentDal的空洞方法定义。该办法用于安装当前类的currentDal到底是adminDal照旧userDal。大家在构造函数中调用SetCurrentDal那些抽象方法,为何在构造函数中调用的来头是,当实例化子类对象时,一定是率先进入其父类的构造函数。当子类AdminBll和UserBll承袭BaseBll<T>的时候,必须重写抽象方法,并且为BaseDal<T>
currentDal对象设置实际的值。笔者先给出子类的代码

贯彻多态的思路:

 1 public class AdminBll : BaseBll<AdminEntity>
 2     {
 3         AdminDal dal = new AdminDal();
 4         public AdminBll()
 5         {
 6 
 7         }
 8         public void Manage()
 9         {
10             new AdminDal().Manage();
11         }
12 
13         public override void SetCurrentDal()
14         {
15             currentDal = new AdminDal();
16         }
17     }

1 public class UserBll : BaseBll<UserEntity>
2     {
3         public override void SetCurrentDal()
4         {
5             base.currentDal = new UserDal();
6         }
7     }
 1 public class AdminBll : BaseBll<AdminEntity>
 2     {
 3         AdminDal dal = new AdminDal();
 4         public AdminBll()
 5         {
 6 
 7         }
 8         public void Manage()
 9         {
10             new AdminDal().Manage();
11         }
12 
13         public override void SetCurrentDal()
14         {
15             currentDal = new AdminDal();
16         }
17     }

1 public class UserBll : BaseBll<UserEntity>
2     {
3         public override void SetCurrentDal()
4         {
5             base.currentDal = new UserDal();
6         }
7     }

一.先创立好父类,在创立好子类;

当实例化子类的对象时,进程为:子类构造函数(不进来)—进入父类构造函数—父类构造内部调用子类重写的SetCurrentDal(当前多态的currentDal到底是何人的实例)—父类构造推行完结(设置currentDal实现)—子类构造函数。那便是空洞方法落成的多态。

当实例化子类的靶龙时,进程为:子类构造函数(不进入)—进入父类构造函数—父类构造内部调用子类重写的SetCurrentDal(当前多态的currentDal到底是什么人的实例)—父类构造施行落成(设置currentDal达成)—子类构造函数。那正是架空方法实现的多态。

2.在父类中开创要求被重写的虚方法或许抽象方法

上面在UI层调用一下,看看结果:

上边在UI层调用一下,看看结果:

三.在子类中重写父类的虚方法恐怕抽象方法

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             AdminBll adminBll = new AdminBll();
 6             AdminEntity admin = new AdminEntity() {AdminName="吴双",AdminPwd="123" };
 7             adminBll.Manage();
 8             adminBll.BaseAdd(admin);
 9             Console.ReadKey();
10         }
11     }
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             AdminBll adminBll = new AdminBll();
 6             AdminEntity admin = new AdminEntity() {AdminName="吴双",AdminPwd="123" };
 7             adminBll.Manage();
 8             adminBll.BaseAdd(admin);
 9             Console.ReadKey();
10         }
11     }

4.注脚父类类型的变量,实例化子类对象—写出通用代码;

输出结果:

输出结果:

 

威尼斯人线上娱乐 2

威尼斯人线上娱乐 3

一.扬言父类变量,实例化子类对象  如:Person per=new Student()

 

 

2.以父类作为艺术的回来值类型,重临具体的子类对象—(轻易工厂,封装变化点);

在付出的历程中,大概你会有大多实体类,每一种实体类都有各自的增加和删除改查等其余共有方法,基于那样的情况,大家就必要一手来将其包装。为何在逻辑层使用了多态,原因便是大家封装父类的时候,不鲜明当前的currentDal到底是adminDal仍然userDal依旧xxxDal。为了封装出基类,那一个多态的靶子就必需了。

在支付的经过中,只怕你会有很多实体类,每种实体类都有分其余增删改查等任何共有方法,基于那样的处境,大家就供给一手来将其包装。为啥在逻辑层使用了多态,原因便是大家封装父类的时候,不明确当前的currentDal到底是adminDal依旧userDal仍然xxxDal。为了封装出基类,那一个多态的目的就必需了。

三,父类作为参数,传入具体的子类对象;

当然在其实当中,倘使你是写原生sql,那样封装的确不便于,种种拼接sql。但若是说你用O大切诺基M框架,EF,Dapper之类的,那么些方法确实是不可缺少的,你大概再增加接口层,加上中国人民解放军海军事工业程大学业作单元,创造对象非new,使用抽象工厂,正视注入等。无论怎么样,那1层的多态一定能用到,只是创制对象稍作修改。

本来在实际被欺诈中,借使您是写原生sql,那样封装的确不轻巧,各类拼接sql。但假若说你用O揽胜M框架,EF,Dapper之类的,这几个措施真的是须求的,你或者再拉长接口层,加上中国人民解放军海军事工业程高校业作单元,创制对象非new,使用抽象工厂,注重注入等。无论如何,那壹层的多态一定能用到,只是成立对象稍作修改。

 

 

 

威尼斯人线上娱乐 4

下1阶段也筹算展开后台架构搭建分享,MVC
WebApi+EF/Dapper+职业单元+抽象工厂/依赖注入Autofac+AutoMapper+日志组件等。

下1阶段也希图展开后台架构搭建分享,MVC
WebApi+EF/Dapper+职业单元+抽象工厂/正视注入Autofac+AutoMapper+日志组件等。

 

自己也曾数18回在类型中搭建此类框架,在缓存升高质量,管理高并发,应用服务器集群,缓存集群,队列集群等地点,这一次也会加入到分享个中。

笔者也曾数十次在项目中搭建此类框架,在缓存升高品质,管理高并发,应用服务器集群,缓存集群,队列集群等地点,此次也会加盟到分享个中。

父类People

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的实现
{
    class People
    {
        #region ID
        int id;

        public int ID
        {
            get { return id; }
            set { id = value; }
        }
        #endregion

        #region Name
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        #endregion

        #region Age
        int age;

        public int Age
        {
            get
            {
                //如果年龄大于0小于等于100,就返回,否则返回18岁
                if (age > 0 && age <= 100)
                {
                    return age;
                }
                else
                {
                    return 18;
                }
            }
            set
            {
                if (value > 0 && value <= 100) //注意这里不是: if(age>0&&age<=100)
                {
                    age = value;
                }
                else
                {
                    age = 18;
                }
            }
        }
        #endregion

        #region Sex
        string sex;

        public string Sex
        {
            get
            {
                //如果性别是男,或者女,就返回相应值,否则就设置为人妖
                if (sex == "男" || sex == "女")
                {
                    return sex;
                }
                else
                {
                    return "人妖";
                }
            }
            set
            {
                if (value == "男" || value == "女")
                {
                    sex = value;
                }
                else
                {
                    sex = "人妖";
                }
            }
        }
        #endregion

        public virtual void Show()
        {
            Console.WriteLine("我是父类People的Show方法");
        }

    }
}

纵然前天的有限分享,对您有点滴协助,请点赞接济,也为友好的前进点赞。

借使前些天的少数分享,对你有点滴帮助,请点赞帮衬,也为和煦的上扬点赞。

 

点击下方关怀,大家共同提高。

点击下方关怀,我们共同升高。

子类Student

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的实现
{
    /// <summary>
    /// 
    /// </summary>
    class Student : People   //实现多态必须要实现方法的重写,实现重写,必须要实现继承
    {
        public override void Show()
        {

             Console.WriteLine("我是Student类的Show方法");
        }
        //public override void Show()
        //{
        //    //方法重写默认是,调用父类的同名方法
        //    base.Show();
        //}
    }
}

 

子类Teacher

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的实现
{
    class Teacher:People  //实现多态必须要实现方法的重写,实现重写,必须要实现继承
    {
        override public void Show()
        {
            Console.WriteLine("我是teacher类的Show方法");
        }
    }
}

 

 测试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的实现
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建父类变量
            People[] p = new People[2];

            //实例化子类对象
            p[0] = new Student();
            p[1] = new Teacher();

            //写出通用代码
            p[0].Show();
            p[1].Show();
            Console.ReadKey();
        }
    }
}

 威尼斯人线上娱乐 5

 

例子2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的练习
{
    class Animal
    {
        public virtual void GetFood()
        { 
           //虚方法往往不知道,怎么实现。
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的练习
{
    class LaoYing:Animal
    {
        public override void GetFood()
        {
            Console.WriteLine("老鹰靠俯冲捕食。");
            //base.GetFood();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的练习
{
    class Snack:Animal
    {
        public override void GetFood()
        {
            Console.WriteLine("蛇靠偷袭捕食");
            //base.GetFood();  //虚方法提供了默认实现,就是调用父类的方法
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的练习
{
    class Program
    {
        static void Main(string[] args)
        {
            //实现多态的步骤
            //1.先写好父类,和可以被重写的方法
            //2.写好子类,重写父类的方法
            //3.声明父类变量,实例化子类对象

            Animal[] ans = new Animal[2];
            ans[0] = new Snack();
            ans[1] = new LaoYing();

            foreach (var item in ans)
            {
                item.GetFood();
            }
            Console.ReadKey();
        }
    }
}

结果是:

威尼斯人线上娱乐 6

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图