【C#】-多态

前言:

  前面总结了继承,接下来大概了解下多态,多态是可以表现多个类型的能力—一个事物可以做多种不同的事情,表现为”一个接口,多个功能”;

What?:

  多态正如字面意思,多种形态,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法,允许将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作;

重载:

  重载是在同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同,就是签名不同,签名由方法名和参数组成。能通过传递不同参数来决定到底调用哪一个同名方法;

  • 方法同名,但参数列表不同
  • 返回值类型不同步可以构成重载–签名不包括返回值
  • 同名方法返回值的类型要相同,否则不能重载
  • 方法的异常类型和数目不会影响重载
static void Main(string[] args)
{
    Printdata p = new Printdata();         
    p.print(6);            // 调用 print 来打印整数
    p.print(3.414);      // 调用 print 来打印浮点数
    p.print("Hello 小仙女,你好哦");  // 调用 print 来打印字符串   
    Console.ReadKey();
}

重写:

  基类方法中使用virtual关键字声明方法和派生类中使用override关键字声明方法名称相同,参数列表也相同,重写也就是相当于重新声明,会覆盖原来的方法和参数;

  • 方法同名,且参数列表相同;
  • 基类方法和派生类方法的签名相同,实现了派生类重写基类中的同名方法
  • 不能使用static修饰
  • 完善子类的方法名与父类的方法名重名出现一条绿线
public class Person
    {
        public override string ToString()
        {
            return "小仙女可爱的都冒泡了";
        }        
    }

隐藏:

  基类中的方法不声明virtual,在派生类中声明与基类同名时,需要使用new关键字,以隐藏基类同名方法

class Program
{
    static void Main(string[] args)
    {
        Teacher t = new Teacher();  
        t.Show();
    }
}

public new void Shout()
{
    Console.WriteLine("Dog Shout");
}

抽象方法抽象类:

  • public abstract void Show(); 抽象方法
  • 抽象方法没有方法体 只有—public abstract void Show();
  • 抽象方法必须在抽象类中;
  • 抽象类无法实例化;
  • 父类是抽象类,子类继承了这个类,必须把这个抽象类中的抽象方法重写;
public abstract class Animal

public class Pig :Animal
{
    public override void Shout()  //抽象方法
    {
        Console.WriteLine("哼哼叫");
    }
}

接口:

  • 是一种规范;接口不能直接实例化 ,不包含方法的实现,接口可以多继承,类只能单继承;
  • 接口,类,结构都可以从多个接口继承,
public class Student:IFly    //单继承
{
    public void SayHello()
    {
        Console.WriteLine("我是学生");
    }
    public void IFly()
    {
        Console.WriteLine("我会飞");
    }
}

 public class Teacher : Person,IFly //多接口继承
{
    public void Say()
    {
        Console.WriteLine("hellow,我是老师");
    }
    public void IFly()
    {
        Console.WriteLine("我会飞");
    }
}

静态与非静态比较:

这里写图片描述

虚方法与抽象方法比较:
这里写图片描述

小结:

  对于面向对象三大特征理解的还不是很透彻,设计模式的学习中,再进行进一步的理解和学习;

猜你喜欢

转载自blog.csdn.net/qiqibei666/article/details/81090070
今日推荐