概述
多态的字面意思是“多种状态”,多态是面向对象三大特性之一,它是指同一个实体同时具有多种形式。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。
功能
1.多态——隐藏基类方法与多态的实现。
——子类可以有与父类方法名相同的方法。
——子类可以重写父类方法
多态就是对象可以表现多个类型的能力。
2.子类的方法名可以和父类的方法名重名,但是会出现一条绿线,瑕疵,怎么解决?
第一种方法:可以在子类方法的修饰符后面加new就解决了。无论是否加new都不影响使用。
第二种方法:可以在父类的方法修饰符后面加virtual,在子类重写父类的方法,加上一个override,调用父类的方法,但是把父类的方法进行了重写,更换了方法里面的内容。
3.虚方法与重写
(1).方法不能用static修饰。
(2).方法重写与基类的签名必须一致。
(3).virtual不能与private一起使用。
4.抽象类与抽象方法由abstract修饰。
5.abstract的使用注意。
(1).抽象方法没有方法体
(2).抽象成员只能存在于抽象类中
(3).抽象类可以有非抽象成员
(4).抽象类的派生类必须实现抽象方法体
(5).抽象类只能用作基类,无法实例化。
6.override与重载(overload)的区别?
重载是方法的名称相同。参数或参数类型不同,进行重载以适应不同的需要。重载(overload)是面向过程的概念。Override是进行基类中函数的重写。Override是面向对象的概念。
重写和重载不一样要区分开。
实战练习
定义一个动物类,在动物类(animal)中有一个叫的抽象方法。写两个子类,一个猫一个狗,继承自动物类,并实现相应的抽象方法。
//随机的产生10个类的对象
//放在数组里
//之后遍历这个数组,把方法调出来。
static void Main(string[] args)
{
//随机的产生10个类的对象
//放在数组里
//之后遍历这个数组,把方法调出来。
Animal[] animal = new Animal[10];
Random r = new Random();
for (int i =0;i<animal.Length;i++)
{
int num = r.Next(1, 5);
switch (num)
{
case 1: animal[i] = new Pig("小赵"); break;
case 2: animal[i] = new Cow("小赵"); break;
case 3: animal[i] = new Cat("小赵"); break;
case 4: animal[i] = new Dog("小赵"); break;
}
}
for (int i=0;i<animal.Length;i++)
{
animal[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);
}
}
实现
1.虚方法:
用virtual修饰的方法叫做虚方法
虚方法可以在子类中通过override关键字来重写
常见的虚方法:ToString()Equals
2.虚方法与抽象方法的区别?
(1).虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
(2).抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。
(3).抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。
3.接口:
(1).接口的定义:interface关键字,接口中可以有属性、方法(未实现)。
(2).接口的名称通常以“I”开头,如IList。
(3).如果一个类即继承了类又实现了接口,那么类必须写在前面。一个类只能继承一个父类,但可以实现多个接口。
(4).完全抽象的一种约定。
(5).接口就是用来实现的。
(6).接口只有方法、属性、索引和事件的声明。
4.C#中的接口和类有什么异同?
(1).不同点:
不能直接实例化接口。
接口不包含方法的实现
接口可以多实现,类只能单实现。
类定义可在不同的源文件之间进行拆分
(2).相同点:
接口、类和结构都可以从多个接口继承
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、方法和属性
5.C#支持多继承么?
类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。类是爹、接口是能力,能有多个能力,但不能有多个爹。
6.抽象类和接口有什么区别?
(1).相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
(2).不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
总结
多态意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。我的理解就是比如说一个三轮它可以在旁边加扫把然后边蹬三轮边让三轮车扫地,也可以在三轮的旁边加拖把,让三轮车有不同的特征。