C# 多态

**1、绝对路径和相对路径
绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件。
相对路径:文件对于应用程序的路径。
结论:
我们在开发中应该去尽量的使用相对路径。
2、装箱、拆箱
装箱:就是将值类型转换为引用类型。
拆箱:将引用类型转换为值类型。
看两种类型是否发生了装箱或者拆箱,要看,这两种类型是否存在继承关系。
3、将创建文件流对象的过程写using当中,会自动的帮助我们释放所占用的资源。
4、实现多态的手段
1)、虚方法
步骤:
1、将父类的方法标记为虚方法,使用关键字 virtual,这个函数可以被子类重新写一个遍历。
**

using System;

namespace 多态
{
    class Program
    {
        static void Main(string[] args)
        {
            //概念:让一个对象能够表现出多种的状态(类型)
            //实现多态的3种手段:1、虚方法 2、抽象类 3、接口
            //Person[] pers = new Person[6];
            Chinese cn1 = new Chinese("韩梅梅");
            Chinese cn2 = new Chinese("李雪");
            Japanese j1 = new Japanese("树下君");
            Japanese j2 = new Japanese("井边子");
            Korea k1 = new Korea("金秀资");
            Korea k2 = new Korea("金秀资");
            American a1 = new American("科比");
            American a2 = new American("奥尼尔");
            Person[] pers = { cn1, cn2, j1, j2, k1, k2, a1, a2,new English("格林"),new English("玛利亚") };
           
            for (int i = 0; i < pers.Length; i++)
            {
                /* if (pers[i] is Chinese)
                 {
                     ((Chinese)pers[i]).Sayhello();
                 }
                 else if (pers[i] is Japanese)
                 {
                     ((Japanese)pers[i]).SayHello();
                 }
                 else if (pers[i] is Korea)
                 {
                     ((Korea)pers[i]).SayHello();
                 }
                 else
                     ((American)pers[i]).SayHello();*/
                pers[i].SayHello();
            }
            Console.ReadKey();
        }
    }

    #region  虚方法
    public class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public Person(string  name)
        {
            this.Name = name;
        }

        public virtual void SayHello()
        {
            Console.WriteLine("我是人类");
        }
    }

    public class Chinese:Person
    {
        public Chinese(string name)
            :base(name)
        {

        }

        public override void SayHello()
        {
            Console.WriteLine("我是中国人,我叫{0}", this.Name);
        }
    }

    public class Japanese:Person
    {
        public Japanese(string  name)
            :base(name)
        { }
        public override  void SayHello()
        {
            Console.WriteLine("我是脚盆国人,我叫{0}", this.Name);
        }
    }

       public class Korea:Person
    {
        public Korea(string name)
            :base(name)
        {

        }

        public override  void SayHello()
        {
            Console.WriteLine("我是棒子之思密达,我叫{0}", this.Name);
        }
    }

    public class American:Person
    {
        public American(string name)
            :base(name)
        {

        }
        public override void SayHello()
        {
            Console.WriteLine("我叫{0},我是米国人", this.Name);
        }
    }
    #endregion

    public class English:Person
    {
        public English(string name)
            :base(name)
        { }

        public override void SayHello()
        {
            Console.WriteLine("我是英国人");
        }
    }
}

2、抽象类
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象。


using System;

namespace 抽象类
{
    class Program
    {
        static void Main(string[] args)
        {
            //狗狗会叫 猫咪也会叫

            Animal a = new Dog();
            a.Bark();
            Console.ReadKey();
        }
    }
    public abstract class Animal
    {
        public abstract void Bark();
        
    }

    public class Dog:Animal
    {
        public override void Bark()
        {
            Console.WriteLine("狗狗旺旺的叫");
        }
    }

    public class Cat:Animal
    {
        public override void Bark()
        {
            Console.WriteLine("猫咪喵喵的叫");
        }

    }
}


using System;

namespace 抽象类
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用多态求矩形的面积和周长以及圆形的面积和周长
            Shape shape = new Circle(5);//new Sqare(5,6)
            double area = shape.GetArea();
            double perimeter = shape.GetPerimeter();
            Console.WriteLine("这个形状的面积是{0},周长是{1}",area,perimeter);
            Console.ReadKey();
        }   
    }

    public abstract class Shape
    {
        public abstract double GetArea();
        public abstract double GetPerimeter();
    }

    public class Circle:Shape
    {
        private double _r;
        public double R
        {
            get { return _r; }
            set { _r = value; }
        }

        public Circle(double r)
        {
            this.R = r;
        }

        public override double GetArea()
        {
            return Math.PI * this.R * this.R;
        }

        public override double GetPerimeter()
        {
            return 2 * Math.PI * this.R;
        }
    }

    public class Square:Shape
    {
        private double _height;
        public double Height
        {
            get { return _height; }
            set { _height = value; }
        }

        private double _width;
        public double Width
        {
            get { return _width; }
            set { _width = value; }
        }

        public Square(double height,double width)
        {
            this.Height = height;
            this.Width = width;
        }

        public override double GetArea()
        {
            return this.Height = this.Width;
        }

        public override double GetPerimeter()
        {
            return (this.Height + this.Width) * 2;
        }
    }
}

using System;

namespace 电脑_移动硬盘_U盘_MP3
{
    class Program
    {
        static void Main(string[] args)
        {
            //用多态来实现 将移动硬盘或者U盘或者MP3插到电脑上进行读写数据
            /*MobileDisk md = new MobileDisk();
            UDisk u = new UDisk();
            MP3 mp3 = new MP3();
            Computer cpu = new Computer();
            cpu.CpuRead(u);
            cpu.CpuWrite(u);
            Console.ReadKey();*/

            MobileStorage ms = new MP3();
            Computer cpu = new Computer();
            cpu.CpuRead(ms);
            cpu.CpuWrite(ms);
            Console.ReadKey();
        }
    }
    /// <summary>
    /// 抽象的父类
    /// </summary>
    public abstract class MobileStorage
    {
        public abstract void Read();
        public abstract void Write();
    }

    public class MobileDisk:MobileStorage
    {
        public override void Read()
        {
            Console.WriteLine("移动硬盘在读取数据");
        }

        public override void Write()
        {
            Console.WriteLine("移动硬盘在写入数据");
        }
    }

    public class UDisk:MobileStorage
    {
        public override void Read()
        {
            Console.WriteLine("U盘在读取数据");
        }

        public override void Write()
        {
            Console.WriteLine("U盘在写入数据");
        }
    }

    public class MP3:MobileStorage
    {
        public override void Read()
        {
            Console.WriteLine("MP3读取数据");
        }

        public override void Write()
        {
            Console.WriteLine("MP3写入数据");
        }

        public void PlayMusic()
        {
            Console.WriteLine("MP3自己可以播放音乐");
        }
    }

    public class Computer
    {
        public void CpuRead(MobileStorage ms)
        {
            ms.Read();
        }

        public void CpuWrite(MobileStorage ms)
        {
            ms.Write();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值