为了避免冗余,将几个类中重复的成员单独拿出来封装成一个类,作为这几个类的父类。
父类---子类 基类----派生类
子类没有继承到父类的私有(private)字段,可以继承属性(public)和方法。
1、一个子类只能有一个父类(单根性)
2、可以传递性继承(传递性)
查看类之间的关系可以通过 查看类图选项, 选中解决方案,右键,查看类图。
子类没有继承父类的构造函数
子类会默认调用父类的无参数构造函数,因为要创建父类对象,让子类可以使用父类中的成员。如果在父类中重新写了一个有参数的构造函数,无参数的构造函数被覆盖,子类就无法调用无参数的构造函数,子类报错。
解决方法:
1、在父类中重新写一个无参数的构造函数;
2、在子类中显示的调用父类的有参数的构造函数,使用关键字base( ); // 一般使用此方法
子类中的方法名和父类中的方法名相同时,子类将父类的方法自动隐藏。在方法名前面加上关键字new,彻底将从父类继承的方法隐藏。
子类可以直接调用父类的方法。
public class Person
{
string _name;
public string Name
{
get{return _name;}
set{_name=value;}
}
public Person(string name)
{
this.Name=name;
}
}
public class student:Person
{
public strudent(string name, int gender,int age,int id)
:base(name,gender,age)
{
this.Id=id;
}
}
public class teacher:Person
{
}
在项目中不应该把类都放在一个项目中。
// 正确显示的格式
int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
student(string name,int ag)
: base(name)
{
_age = Age;
}
假设父类子类都含有方法 public void print(){ }
若在子类中将此方法隐藏,则为 public new void print() { }
再次总结new的作用:
1、创建对象;
2、隐藏父类那里继承过来的同名成员,使子类调用不到父类的成员。
如果一个类没有继承其他类,默认继承object类;其实:在C#中所有的类都直接或间接的继承object类。
调用(父类与子类)
子类对象可以调用父类对象的成员,但是父类对象不可以调用子类的成员,只能调用自身的成员。
1、子类可以赋值给父类:应用 如果有一个地方需要一个父类做参数,我们可以用一个子类代替。
Person per=new student(); 或者写成
Student str=new student ( );
Person s=str;
2、如果父类中装的是子类对象,那么可以将父类强制转换为子类对象;
如 上面的例子,满足Person s=str; 则 强制转换 : student ss = (student) s;
由于teacher是person的子类,但是不可以teacher tt=(teacher)s; 因为父类中装的是子类student中的对象。
需要进行判断一下,使用is 或者 as
if(s is teacher){ // 成功返回TRUE,失败返回FALSE
Teacher tt=(Teacher)s;
}else { }
或者使用as
Teacher t= s as Teacher; // 成功返回正确结果,错误返回NULL
父类与子类举例:
namespace convert
{
class Program
{
static void Main(string[] args)
{
Person[] people = new Person[10]; // 存在了父类数组中
Random num = new Random();
for (int i = 0; i < 10; i++)
{
int rand = num.Next(1, 6); // 产生随机数,注意这里是产生1-6之间的随机数,不包括6, 只产生0 、1、2、3、4、5
switch (rand)
{
case 1:
people[i] = new Vivi(); // 子类可以赋值给父类
break;
case 2:
people[i] = new Ququ();
break;
case 3:
people[i] = new Evil();
break;
case 4:
people[i] = new Wea();
break;
case 5:
people[i] = new Ewi();
break;
default:
people[i] = new Person();
break;
}
}
for (int i = 0; i < 10; i++)
{
if (people[i] is Vivi)
{
((Vivi)people[i]).showvivi(); // 父类可以转换为子类(前提是父类装的是子类)
}
else if (people[i] is Ququ)
{
((Ququ)people[i]).showququ();
}
else if (people[i] is Evil)
{
((Evil)people[i]).showevil();
}
else if (people[i] is Wea)
{
((Wea)people[i]).showwea();
}
else if (people[i] is Ewi)
{
((Ewi)people[i]).showpeewi();
}
}
Console.ReadKey();
}
// 父类与子类的关系 5个子类
public class Person
{
public void showpeson()
{
Console.WriteLine("hello,i'm person");
}
}
public class Vivi : Person
{
public void showvivi()
{
Console.WriteLine("hello,i'm vivi");
}
}
public class Ququ : Person
{
public void showququ()
{
Console.WriteLine("hello,i'm Ququ");
}
}
public class Evil : Person
{
public void showevil()
{
Console.WriteLine("hello,i'm Evil");
}
}
public class Wea : Person
{
public void showwea()
{
Console.WriteLine("hello,i'm Wea");
}
}
public class Ewi : Person
{
public void showpeewi()
{
Console.WriteLine("hello,i'm ewi");
}
}
}
}