C#之多态
2015-11-21 23:08
302 查看
一、什么是多态
简单来说,多态就是对象可以表现多个类型的能力,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。
二、几种建立多态的方式
1、用父类实现多态
多个类可以从单个基类“继承”。通过继承,类在基类所在的同一实现中接收基类的所有方法、属性和事件。这样,便可根据需要来实现附加成员,而且可以重写基成员以提供不同的实现。
(1、)使用new修饰符隐藏父类的成员
在子类中,可用new修饰符隐藏父类的成员,隐藏父类的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。
class Program
{
static void Main(string[] args)
{
Aniaml a = new Aniaml();
a.Eat();
Dog dog = new Dog();
dog.Eat();
Aniaml animal = dog; //dog对象赋给animal变量
animal.Eat(); //调用dog的Eat旧方法—父类的方法
}
}
class Aniaml //定义动物类Animal
{
public void Eat()
{
Console.WriteLine("动物吃东西");
}
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
new public void Eat() //new隐藏父类成员
{
Console.WriteLine("狗吃骨头");
}
} 可以理解为,使用new关键字后,使得Dog中的Eat方法和Animal中的Eat方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。
(2、)使用override重载父类成员实现多态
virtual供父类的函数成员使用,表明是虚拟的成员
override供子类的函数成员使用,表明是重载的成员
父类的虚拟函数可以被重载,其他的成员不可以被重载
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Cat cat = new Cat();
Aniaml animal = dog ; //dog对象赋给animal变量
animal.Eat(); //继承的父类方法已被完全覆盖,等价于dog.Eat()
animal = cat;
animal.Eat(); //等价于cat.Eat()
}
}
class Aniaml //定义动物类Animal
{
public virtual void Eat()
{
Console.WriteLine("动物吃东西");
}
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
public override void Eat()
{
Console.WriteLine("狗吃骨头");
}
}
class Cat : Aniaml
{
public override void Eat()
{
Console.WriteLine("猫吃鱼");
}
} 子类重载父类的虚拟函数,然后由父类变量引用不同子类对象的同名函数,同样的animal.Eat方法,运行结果不同,这是行为多态性。
2、用抽象类实现多态
抽象类同时提供继承和接口的元素。抽象类本身不能实例化,它必须被继承。该类的部分或全部成员可能未实现,该实现由继承类提供。已实现的成员仍可被重写,并且继承类仍可以实现附加接口或其他功能。
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Eat();
Console.ReadKey();
}
}
public abstract class Aniaml //定义抽象类Animal
{
public abstract void Eat(); //定义抽象方法Eat
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
public override void Eat()
{
Console.WriteLine("狗吃骨头");
}
} 抽象方法只是对方法进行了定义,而没有实现,如果一个类包含了抽象方法,那么该类也必须用abstract声明为抽象类,一个抽象类是不能实例化的。
3、用接口实现多态
多个类可实现相同的“接口”,而单个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口描述类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,但将这些成员的特定实现留给实现类去完成。
interface IShout //定义接口IShout
{
void IShout();
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.IShout();
Cat cat = new Cat();
cat.IShout();
}
}
class Dog :IShout //实现接口IShout
{
public void IShout()
{
Console.WriteLine("我会叫");
}
}
class Cat :IShout //实现接口IShout
{
public void IShout()
{
Console.WriteLine("我也会叫");
}
} 狗会叫,猫也会叫,它们都有会叫的能力,因此可以通过定义和实现接口来实现功能的添加,也实现了多态性。
以上是自己关于C#多态的一个简单总结,不断努力,不断进步。。。
简单来说,多态就是对象可以表现多个类型的能力,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。
二、几种建立多态的方式
1、用父类实现多态
多个类可以从单个基类“继承”。通过继承,类在基类所在的同一实现中接收基类的所有方法、属性和事件。这样,便可根据需要来实现附加成员,而且可以重写基成员以提供不同的实现。
(1、)使用new修饰符隐藏父类的成员
在子类中,可用new修饰符隐藏父类的成员,隐藏父类的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。
class Program
{
static void Main(string[] args)
{
Aniaml a = new Aniaml();
a.Eat();
Dog dog = new Dog();
dog.Eat();
Aniaml animal = dog; //dog对象赋给animal变量
animal.Eat(); //调用dog的Eat旧方法—父类的方法
}
}
class Aniaml //定义动物类Animal
{
public void Eat()
{
Console.WriteLine("动物吃东西");
}
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
new public void Eat() //new隐藏父类成员
{
Console.WriteLine("狗吃骨头");
}
} 可以理解为,使用new关键字后,使得Dog中的Eat方法和Animal中的Eat方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。
(2、)使用override重载父类成员实现多态
virtual供父类的函数成员使用,表明是虚拟的成员
override供子类的函数成员使用,表明是重载的成员
父类的虚拟函数可以被重载,其他的成员不可以被重载
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Cat cat = new Cat();
Aniaml animal = dog ; //dog对象赋给animal变量
animal.Eat(); //继承的父类方法已被完全覆盖,等价于dog.Eat()
animal = cat;
animal.Eat(); //等价于cat.Eat()
}
}
class Aniaml //定义动物类Animal
{
public virtual void Eat()
{
Console.WriteLine("动物吃东西");
}
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
public override void Eat()
{
Console.WriteLine("狗吃骨头");
}
}
class Cat : Aniaml
{
public override void Eat()
{
Console.WriteLine("猫吃鱼");
}
} 子类重载父类的虚拟函数,然后由父类变量引用不同子类对象的同名函数,同样的animal.Eat方法,运行结果不同,这是行为多态性。
2、用抽象类实现多态
抽象类同时提供继承和接口的元素。抽象类本身不能实例化,它必须被继承。该类的部分或全部成员可能未实现,该实现由继承类提供。已实现的成员仍可被重写,并且继承类仍可以实现附加接口或其他功能。
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Eat();
Console.ReadKey();
}
}
public abstract class Aniaml //定义抽象类Animal
{
public abstract void Eat(); //定义抽象方法Eat
}
class Dog : Aniaml //定义Dog类,从Animal派生
{
public override void Eat()
{
Console.WriteLine("狗吃骨头");
}
} 抽象方法只是对方法进行了定义,而没有实现,如果一个类包含了抽象方法,那么该类也必须用abstract声明为抽象类,一个抽象类是不能实例化的。
3、用接口实现多态
多个类可实现相同的“接口”,而单个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口描述类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,但将这些成员的特定实现留给实现类去完成。
interface IShout //定义接口IShout
{
void IShout();
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.IShout();
Cat cat = new Cat();
cat.IShout();
}
}
class Dog :IShout //实现接口IShout
{
public void IShout()
{
Console.WriteLine("我会叫");
}
}
class Cat :IShout //实现接口IShout
{
public void IShout()
{
Console.WriteLine("我也会叫");
}
} 狗会叫,猫也会叫,它们都有会叫的能力,因此可以通过定义和实现接口来实现功能的添加,也实现了多态性。
以上是自己关于C#多态的一个简单总结,不断努力,不断进步。。。
相关文章推荐
- C# WPF 实现打印预览和打印
- 关于虚方法virtual和抽象方法以及多态的研究
- c# 基本 用法
- C#中的反射例子及思考
- C#学习笔记
- C# 中的 ConfigurationManager类引用方法
- c#绘制曲线图遇到的问题
- C#基础篇总结(二)
- c#操作Excel(2)
- C# 设计时动态改变实体在PropertyGrid中显示出来的属性
- C# 自定义属性在propertyGrid控件中显示
- C# 自定义属性在propertyGrid控件中显示
- C# 设计时动态改变实体在PropertyGrid中显示出来的属性
- DirectX天空球和天空盒子模型
- 轻松学习C#的运算符
- Interview Q&A - 两个字符串整数相加返回和的字符串(C#)
- 轻松学习C#的预定义数据类型
- C# Winform中WndProc 函数作用
- C#获取网卡信息
- c#文件操作大全