首页 > 编程语言 >C#-多态

C#-多态

时间:2022-08-31 21:36:20浏览次数:43  
标签:Console Name C# void 多态 class age public

在派生类中重写基类的虚方法

虚方法的重写

public virtual void Move()
{

}
public override void Move()
{

}

class Vehicle
    {
        string name;                            //定义字段
        public string Name                      //定义属性为字段赋值
        {
            get { return name; }
            set { name = value; }
        }
        public virtual void Move()              //定义方法输出交通工具的形态
        {
            Console.WriteLine("{0}都可以移动", Name);
        }
    }
    class Train : Vehicle
    {
        public override void Move()             //重写方法输出交通工具形态
        {
            Console.WriteLine("{0}在铁轨上行驶", Name);
        }
    }
    class Car : Vehicle
    {
        public override void Move()             //重写方法输出交通工具形态
        {
            Console.WriteLine("{0}在公路上行驶", Name);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Vehicle vehicle = new Vehicle();        //创建Vehicle类的实例
            Train train = new Train();              //创建Train类的实例
            Car car = new Car();                //创建Car类的实例
	//使用基类和派生类对象创建Vehicle类型数组
            Vehicle[] vehicles = { vehicle, train, car };
            vehicle.Name = "交通工具";          //设置交通工具的名字
            train.Name = "火车";              //设置交通工具的名字
            car.Name = "汽车";                    //设置交通工具的名字
            vehicles[0].Move();                 //输出交通工具的形态
            vehicles[1].Move();                 //输出交通工具的形态
            vehicles[2].Move();                 //输出交通工具的形态
            Console.ReadLine();
        }
    }

抽象类与抽象方法

访问修饰符 abstract class 类名 : 基类或接口
{
    //类成员
    public abstract void AbsMethod();//抽象方法
}
 public abstract class Market
    {
        public string Name { get; set; }//商场名称
        public string Goods { get; set; }//商品名称
        public abstract void Shop();//抽象方法,用来输出信息
    }
    public class WallMarket : Market//继承抽象类
    {
        public override void Shop()//重写抽象方法
        {
            Console.WriteLine(Name + "购买" + Goods);
        }
    }
    public class TaobaoMarket : Market//继承抽象类
    {
        public override void Shop()//重写抽象方法
        {
            Console.WriteLine(Name + "购买" + Goods);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Market market = new WallMarket();//使用派生类对象创建抽象类对象
            market.Name = "沃尔玛";
            market.Goods = "七匹狼西服";
            market.Shop();
            market = new TaobaoMarket();//使用派生类对象创建抽象类对象
            market.Name = "淘宝";
            market.Goods = "韩都衣舍花裙";
            market.Shop();
            Console.ReadLine();
        }
    }

抽象类不能直接实例化,不能被密封

接口的使用

修饰符 interface 接口名称 : 继承的接口列表
{
    接口内容;
}

接口只能定义,不能实例化,接口成员永远是公共的(前面要加public)。一个类可以继承多个接口。接口中不能有字段。

interface IPerson//定义IPerson接口
    {
        string Name { get; set; }//姓名属性
        int Age { get; set; }//年龄属性
        void Speek();//说话行为
        void Work();//工作行为
    }
    class Student : IPerson//定义学生类,继承自IPerson接口
    {
        public string Name { get; set; }//实现Name属性
        private int age;//定义age字段,用来表示年龄
        public int Age//实现Age属性
        {
            get
            {
                return age;
            }
            set
            {
                if (age > 0 && age < 120)//控制输入范围
                {
                    age = value;
                }
            }
        }
        public void Speek()//实现Speek方法
        {
            Console.WriteLine(Name + ":老师好");
        }
        public void Work()//实现Work方法
        {
            Console.WriteLine(Name + "同学开始记笔记");
        }
    }
    class Teacher : IPerson//定义老师类,继承自IPerson接口
    {
        public string Name { get; set; }//实现Name属性
        private int age;//定义age字段,用来表示年龄
        public int Age//实现Age属性
        {
            get
            {
                return age;
            }
            set
            {
                if (age > 0 && age < 120)//控制输入范围
                {
                    age = value;
                }
            }
        }
        public void Speek()//实现Speek方法
        {
            Console.WriteLine(Name + ":同学们好");
        }
        public void Work()//实现Work方法
        {
            Console.WriteLine(Name + "老师开始上课");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //使用派生类对象创建接口数组
            IPerson[] person = new IPerson[] { new Student(), new Teacher() };
            person[0].Name = "peter";//为学生姓名赋值
            person[0].Age = 20;//为学生年龄赋值
            person[1].Name = "mike";//为老师姓名赋值
            person[1].Age = 40;//为老师年龄赋值
            person[0].Speek();//学生的说话行为
            person[1].Speek();//老师的说话行为
            Console.WriteLine();//换行
            person[1].Work();//老师的工作行为
            person[0].Work();//学生的工作行为
            Console.ReadLine();
        }
    }

标签:Console,Name,C#,void,多态,class,age,public
From: https://www.cnblogs.com/shazamsjtu/p/16644231.html

相关文章

  • CentOS设置默认启动命令行(不启动图形界面)
    CentOS设置默认启动命令行(不启动图形界面)-java_zhao-博客园 https://www.cnblogs.com/java-xz/p/7351867.htmlCentOS中如何进入图形界面和文字界面,Linux真正的服......
  • React报错之Rendered more hooks than during the previous render
    正文从这开始~总览当我们有条件地调用一个钩子或在所有钩子运行之前提前返回时,会产生"Renderedmorehooksthanduringthepreviousrender"错误。为了解决该错误,将所......
  • Cocoapods的简单介绍和使用
    1、Cocoapods运行环境和gem命令1.1Ruby运行环境和gem命令Mac自带Ruby环境。如果gem版本太旧,可以使用以下指令升级到最新: sudogemupdate--system检查Ruby版本指......
  • JavaScript之数组常用API
    这篇文章主要帮助大家简单理解数组的一些常用API用法,许多小伙伴常用方法记不住?别急,看完下面的介绍您一定就会明白各个方法是如何用的了......
  • mapreduce案例二
    练习题:求每个平均消费,如果遇到异常数据,money异常,就回填为10数据:张三,12月3号,20张三,12月3号,10李四,12月3号,12王五,12月3号,10王五,12月2号王五,12月2号,30王二麻,12月......
  • CF643G Choosing Ads
    传送门思路先考虑一下\(p>50\)的情况这时候就是求“绝对众数”一个方法就是用“摩尔投票”法方法就是:每次将不同的两个数去掉,剩下的那种数就是绝对众数(这是保证......
  • MSDE2 personal project
    姓名:王思恩学号:20020007070姓名和学号?王思恩,200023230本项目属于哪门课程?中国海洋大学22夏《移动软件开发》项目名称?跑步打卡小程序博客地址?https://......
  • C#小知识特殊的DefaultValueAttribute
    publicclassPeople{privatestring_Name="小明";publicstringName{get{return_Name;}set{_Name=value;}}......
  • elasticsearch启动失败
    elasticsearch启动失败修改elasticsearch.ymlxpack.security.enabled:false//关闭密码验证xpack.security.enrollment.enabled:false//关闭注册xpack.securi......
  • Qt之TCP通信笔记-发送端、接收端、客户端、服务端及write()、read()
    一、QtTCP通信接收端(read()):1.从发射newConnection()信号开始(当有新的TCP连接,会发射newConnection()信号);2.当QTcpSocket缓存接收到新的数据时发射readyRead信号;3.连......