C#多态

本文通过C#代码示例展示了面向对象编程中的继承、多态特性,包括方法的覆盖、向上转型和向下转型的使用。案例涵盖了形状类的抽象与具体实现,以及不同形状的绘制。同时,还探讨了通过父类引用调用子类方法的场景,以及如何根据条件返回不同类型的子类实例。
摘要由CSDN通过智能技术生成

 

class Animal
{
 	public virtual void call() {
        Console.WriteLine("无声的叫唤"); 
    }
}
class Dog : Animal
{
    // new的作用是隐藏父类的同名方法
    //public new void call() { 
    //Console.WriteLine("叫声:汪~汪~汪~"); 
    //}  	
        public override  void call() { 
            Console.WriteLine("叫声:汪~汪~汪~"); 
        }
        public void smell() { 
            Console.WriteLine("嗅觉相当不错!");
        }
}



 static void Main(string[] args)
 {
    Animal animal = new Dog(); //向上转型 
    animal.call();
    
    Dog dog = (Dog)animal;//向下转型
    dog.call();                 
    dog.smell(); 

 }
//案例
public class Shape
{
    public int X { get; private set; }
    public int Y { get; private set; }
    public int Height { get; set; }
    public int Width { get; set; }
   
    // 虚方法
    public virtual void Draw()
    {
        Console.WriteLine("执行基类的画图任务");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        base.Draw();
        Console.WriteLine("画一个圆形");
    }
}
class Rectangle : Shape
{
    public override void Draw()
    {
        base.Draw();
        Console.WriteLine("画一个长方形");
    }
}
class Triangle : Shape
{
    public override void Draw()
    {
        base.Draw();
        Console.WriteLine("画一个三角形");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Shape circle=new Circle();
        circle.Draw();
        Shape rectangle=new Rectangle();
        rectangle.Draw();
        Shape triangle=new Triangle();
        triangle.Draw();
    }
}
//父类做返回值
class Person
{
    public virtual void Eat()
    {

    }
}
class WhitePerson:Person
    {
        public override void Eat()
        {
            Console.WriteLine("热狗");
        }
 }

    class YellowPerson:Person
    {
        public override void Eat()
        {
            Console.WriteLine("饺子");
        }

        //写一个GetPerson方法,返回值为父类,
        //根据传入的不同人种来确定吃什么
        Person GetPerson(string s)
        {
            Person p=null;
            if (s.Equals("中国人"))
            {
                p = new YellowPerson();
            }
            else if (s.Equals("外国人"))
            {
                p= new WhitePerson();
            }
            else
            {
                return p;
            }
            p.Eat();
            return p;
        }
    }
    
//父类做参数
    class Animal
    {
        public virtual void Swimming()
        {
            Console.WriteLine("动物游泳");
        }
    }
    class Cat:Animal
    {
        public override void Swimming()
        {
            Console.WriteLine("猫挠");
        }
        //写一个方法,完成动物游泳(对象做参数)
        void GetSwimming(Animal a)//a是引用
        {
            if (a is Cat)
            {
                Cat c = (Cat)a;//向下转型
                c.Swimming();
            }
        }
     }


        static void Main(string[] args)
        {
            Cat c = new Cat();
            Dog d = new Dog();
            Animal a = c;
           // Animal a = d;
            c.GetSwimming(a);
        }
    

        static void Main(string[] args)
        {
            

            //20.
            Shape[] s = new Shape[3];
            s[0] = new Cirele(2); 
            s[0].girth();
            s[0].area();

            s[1] = new Rect(2,5);
            s[1].girth();
            s[1].area();

            s[2] = new Square(2);
            s[2].girth();
            s[2].area();
            
            //21.
            Shape s1 = new Shape();
            s1 = new SS().getShape(1);
            s1.girth();
            s1.area();

            s1 = new SS().getShape(0);
            s1.girth();
            s1.area();

            s1 = new SS().getShape(2);
            s1.girth();
            s1.area();

            
        }
    class Shape
    {
        public virtual  void girth()
        {
            
        }
        public  virtual void area()
        {
            
        }
        
    }
    class Cirele : Shape
    {
        private double r;

        public double  R
        {
            get { return r; }
            set { r = value; }
        }
        public Cirele() { }
        public Cirele (double a)
        {
            r = a;
        }
        public  override void girth()
        {
            Console.WriteLine("圆的周长为:"+2 * Math.PI * r);
        }
        public override void area()
        {
            Console.WriteLine("圆的面积为:" + Math.PI * r * r);
        }
        
    }
    class Rect : Shape
    {
        private double a;
        private double b;

        public double B
        {
            get { return b; }
            set { b = value; }
        }

        public double A
        {
            get { return a; }
            set { a = value; }
        }
        public Rect(double a, double b)
        {
            this.a = a;
            this.b = b;
        }
        public Rect() { }
        public override void girth( )
        {
            Console.WriteLine("矩形的周长为:" + 2 * (a + b));
        }
        public override void area()
        {
            Console.WriteLine("矩形的面积为:" + (a * b));
        }
       
    }
    class Square : Rect
    {
        private double  b;
        
        public double  B
        {
            get { return b; }
            set { b = value; }
        }
        public Square() { }
        public Square( double w) :base(w,0)
        {
            b = w;
        }
        public override void girth()
        {
            Console.WriteLine("正方形的周长为:" + 4 *b);
        }
        public override void area()
        {
            Console.WriteLine("正方形的面积为:" + (b* b));
        }
    }
    class SS
    {
        //21.
        public Shape getShape(int i)
        {
            Shape a = null;
            if (i == 0)
            {
                a = new Cirele(1);

            }
            else if (i == 1)
            {
                a = new Rect(3,2);

            }
            else if (i == 2)
            {
                a = new Square(2);
            }
            return a;
        }

        //22.
        public void Get(Shape s)
        {
            if (s is Cirele)
            {
                s.girth();
                s.area();
            }
            else if (s is Rect)
            {
                s.girth();
                s.area();
            }
            else if (s is Square)
            {
                s.girth();
                s.area();
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值