c#的多态基础---虚方法
定义父类
public class Person
{
//private是私有的只可以在类中使用
//public是公有的可以在别处使用
//定义字段
private string _name;
//定义属性
public string Name
{
get { return _name; }
set { _name = value; }
}
//定义构造函数(其中构造函数的名称必须与类名相同而且必须没有返回值)
public Person(string name)
{
this.Name = name;
}
//定义一个构造方法
public void SayHello()
{
Console.WriteLine("我是人类");
}
}```
# 定义几个子类继承与父类
```csharp
public class Chinese:Person
{
//子类创建一个继承父类的构造函数一般用关键字base
public Chinese(string name) : base(name)
{
}
//子类定义一个构造方法
public void SayHello()
{
Console.WriteLine("我是中国人,我叫{0}", this.Name);
}
}
public class Japanese : Person
{
//子类创建一个继承父类的构造函数一般用关键字base
public Japanese(string name) : base(name)
{
}
//子类定义一个构造方法
public void SayHello()
{
Console.WriteLine("我是日本人,我叫{0}", this.Name);
}
}
public class Korea : Person
{
//子类创建一个继承父类的构造函数一般用关键字base
public Korea(string name) : base(name)
{
}
//子类定义一个构造方法
public void SayHello()
{
Console.WriteLine("我是韩国人,我叫{0}", this.Name);
}
}
然后调用实例看下
static void Main(string[] args)
{
//调用类的实例
Chinese cn1 = new Chinese("韩梅梅");
Chinese cn2 = new Chinese("李雷");
Japanese j1 = new Japanese("山田君");
Japanese j2 = new Japanese("山本太郎");
Korea k1 = new Korea("朴智星");
Korea k2 = new Korea("全智贤");
Person[] pers = { cn1, cn2, j1, j2, k1, k2 };
for (int i = 0; i < pers.Length; i++)
{
pers[i].SayHello();
}
Console.ReadKey();
}
由以上的代码可得结果是:
我是人类
我是人类
我是人类
我是人类
我是人类
我是人类
为什么会这样显示呢?
因为per[i]这个是父类的表现,所以都会调父类的SayHello的构造方法
那么我们普通的做法是什么呢?
static void Main(string[] args)
{
//调用类的实例
Chinese cn1 = new Chinese("韩梅梅");
Chinese cn2 = new Chinese("李雷");
Japanese j1 = new Japanese("山田君");
Japanese j2 = new Japanese("山本太郎");
Korea k1 = new Korea("朴智星");
Korea k2 = new Korea("全智贤");
Person[] pers = { cn1, cn2, j1, j2, k1, k2 };
for (int i = 0; i < pers.Length; i++)
{
/*pers[i].SayHello();*/
//判断是否可以转为子类
if (pers[i] is Chinese)
{
//可以的则转为子类然后调用子类的SayHello方法
((Chinese)pers[i]).SayHello();
}
else if (pers[i] is Japanese)
{
((Japanese)pers[i]).SayHello();
}
else if (pers[i] is Korea)
{
((Korea)pers[i]).SayHello();
}
}
Console.ReadKey();
}
这样的话结果是:
我是中国人,我叫韩梅梅
我是中国人,我叫李雷
我是日本人,我叫山田君
我是日本人,我叫山本太郎
我是韩国人,我叫朴智星
我是韩国人,我叫全智贤
以上的方法就是将实例转为子类形式再调用自己的构造方法SayHello方法
那么还有更简单的方法吗?
答案是有的,接下来我们就要讲下虚方法
让pers[i]表现出多方法
虚方法的步骤
1.将父类的方法标记为虚方法,使用关键字virtual,这个函数可以让被子类重写一遍
2.子类的方法需要加override关键字
附上完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 多肽的虚方法
{
class Program
{
static void Main(string[] args)
{
//调用类的实例
Chinese cn1 = new Chinese("韩梅梅");
Chinese cn2 = new Chinese("李雷");
Japanese j1 = new Japanese("山田君");
Japanese j2 = new Japanese("山本太郎");
Korea k1 = new Korea("朴智星");
Korea k2 = new Korea("全智贤");
Person[] pers = { cn1, cn2, j1, j2, k1, k2 };
for (int i = 0; i < pers.Length; i++)
{
/*pers[i].SayHello();*/
//判断是否可以转为子类
/*if (pers[i] is Chinese)
{
//可以的则转为子类然后调用子类的SayHello方法
((Chinese)pers[i]).SayHello();
}
else if (pers[i] is Japanese)
{
((Japanese)pers[i]).SayHello();
}
else if (pers[i] is Korea)
{
((Korea)pers[i]).SayHello();
}*/
pers[i].SayHello();
}
Console.ReadKey();
}
//为了看的清晰才写在这里
//定义一个父类
public class Person
{
//private是私有的只可以在类中使用
//public是公有的可以在别处使用
//定义字段
private string _name;
//定义属性
public string Name
{
get { return _name; }
set { _name = value; }
}
//定义构造函数(其中构造函数的名称必须与类名相同而且必须没有返回值)
public Person(string name)
{
this.Name = name;
}
//定义一个构造方法(虚方法加上virtual)
public virtual void SayHello()
{
Console.WriteLine("我是人类");
}
}
//下面创造几个子类继承与这个父类
public class Chinese:Person
{
//子类创建一个继承父类的构造函数一般用关键字base
public Chinese(string name) : base(name)
{
}
//子类定义一个构造方法(子类需要重写构造方法加上override关键字)
public override void SayHello()
{
Console.WriteLine("我是中国人,我叫{0}", this.Name);
}
}
public class Japanese : Person
{
//子类创建一个继承父类的构造函数一般用关键字base
public Japanese(string name) : base(name)
{
}
//子类定义一个构造方法
public override void SayHello()
{
Console.WriteLine("我是日本人,我叫{0}", this.Name);
}
}
public class Korea : Person
{
//子类创建一个继承父类的构造函数一般用关键字base
public Korea(string name) : base(name)
{
}
//子类定义一个构造方法
public override void SayHello()
{
Console.WriteLine("我是韩国人,我叫{0}", this.Name);
}
}
}
}