C#中方法的重写(实现多态)

问题1:什么时候要重写方法?

当子类继承父类时,子类中方法名称与父类中方法名称重名时,需要对父类的方法使用virtual变成虚方法;使用关键字override重写子类方法。

问题2:什么是重写?

“重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。

练习

static void Main(string[] args)
{
    Person p = new Person();
    p.Show();

    Teacher t = new Teacher();
    t.Show();

    Console.ReadKey();
}
public class Person
{
   string _name;
   public string name
   {
       get { return _name; }
       set { _name = value; }
   }
   public virtual void Show()
   {
       Console.WriteLine("我是人");
   }
}

public class Teacher:Person//子类默认调用父类中无参的构造函数,如果父类中只写有参函数,没有无参函数,会报红线
{
    public override void Show()//子类中方法可以与父类中方法重名,但子类方法名会报绿线。在子类方法修饰符后加 new ,即可隐藏父类方法;也可对父类方法使用virtual修饰,override修饰子类方法进行方法的重写
   	{
       base.Show();//在子类中调用父类中方法
   	}
	public override void Show()//调用父类方法,但是把父类方法中的内容进行重写,更换内容
   	{
       Console.WriteLine("我是{0},{1}岁,是{2}生", this.name, this.age, this.gender);
   	}
}

拓展:

base:关键字用于从子类中访问父类成员。即使父类的方法在子类中重写,仍可以使用base关键字调用。

多态:

多态就是对象可以表现多个类型的能力。

虚方法特点:

1、方法不能用static修饰
2、子类方法的重写必须与基类的签名一致。父类中方法必须有virtual,子类中才能使用关键字override进行重写。
3、关键字virtual不能与修饰符private一起使用

重载与重写:

重载是方法的名称相同,参数类型或参数个数不同,进行重载以适应不同的需求。重载(overload)是面向过程的概念。

重写是进行基类中函数的重写。重写(override)是面向对象的概念。

多态练习

随机产生10个类的对象 放在数组里,遍历数组,调出方法。

class Program
{
    static void Main(string[] args)
    {
        Animal[] am = new Animal[10];
        Random r = new Random();

        for (int i = 0; i < am.Length; i++)
        {
            int num = r.Next(1, 6);
            switch (num)
            {
                case 1: am[i] = new Pig("小猪"); break;
                case 2: am[i] = new Dog("小狗"); break;
                case 3: am[i] = new Cow("小牛"); break;
                case 4: am[i] = new Cat("小牛"); break;
                case 5: am[i] = new Bird("小鸟");break;
            }
        }

        for (int i = 0; i <am.Length; i++)
        {
            am[i].Shout();

        }
        Console.ReadKey();
    }
    
}
public abstract class Animal//抽象父类
{

    public Animal(string name)
    {
        this._name = name;
    }

    string _name;
    public string name
    {
        get { return _name; }
        set { _name = value; }
    }
    public abstract void Shout();

}

public class Pig : Animal
{
    public Pig(string name) : base(name)
    {

    }
    public override void Shout()
    {
        Console.WriteLine("{0}我是猪",this.name );
    }
}

public class Dog : Animal
{
    public Dog(string name) : base(name)
    {

    }
    public override void Shout()
    {
        Console.WriteLine("{0}我是狗",this.name );
    }
}
public class Cow : Animal
{
    public Cow(string name) : base(name)
    {

    }
    public override void Shout()
    {
        Console.WriteLine("{0}我是牛",this.name );
    }
}

public class Cat : Animal
{
    public Cat(string name) : base(name)
    {

    }
    public override void Shout()
    {
        Console.WriteLine("{0}我是猫",this.name );
    }
}

public class Bird : Animal
{
    public Bird(string name) : base(name)
    {

    }

    public override void Shout()
    {
        Console.WriteLine("{0}我是鸟",this.name );
    }
}

常见虚方法

ToString()

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();

        Console.WriteLine(p);
        Console.ReadKey();
    }
}
public class Person
{
    public override string ToString()//所有类的父类都是object,对父类进行重写
    {
        return "哈哈哈哈啊";
    }
}

你可能感兴趣的:(---C#,C#基础学习)