标签:
一、什么继承?
1.父类的相关成员,会自动派生到子类去。public protected
2.子类可以扩展父类的相关成员。
3.子类可以替代父类来使用,但父类不能替代子类来使用。
二、继承的语法:
class 子类名:父类名
{
}
三、继承的规则:
(一)成员变量的继承
1.public protected
2.如果同名就隐藏。子类与父类各自用各自的成员。
(二)属性的继承
1.属性一般只有public
2.如果同名就隐藏。子类与父类各自用各自的成员。new 关键字:子类隐藏父类的同名方法,提供自己的新版本。(规范)
namespace ConsoleApplication31
{
class Ren
{
private string _Name; //成员变量
public string Name //属性
{
get { return _Name; }
set { _Name = value; }
}
private int _Age;
public int Age
{
get { return _Age; }
set { _Age = value; }
}
public void Speak()
{
Console.WriteLine("我的名字叫"+_Name+",今年岁"+_Age+"了");
}
}
class NvRen : Ren
{
private readonly bool _Sex = false;//只读字段
public bool Sex
{
get { return _Sex; }
}
new public void Speak() // new规范隐藏写法
{
Console.WriteLine("我是一个女人,名字叫"+Name+",今年"+Age+"岁");
}
}
class Program
{
static void Main(string[] args)
{
NvRen n = new NvRen(); //成员变量:如果同名就隐藏。子类与父类各自用各自的成员。
n.Speak();
Ren r = new Ren(); //属性:如果同名就隐藏。子类与父类各自用各自的成员。
r.Speak();
r = n; //输出的会是什么呢?是: 我的名字叫"+_Name+",今年岁"+_Age+"了。
r.Speak(); //同名,被子类隐藏了
Console.ReadLine();
}
}
}
(三)方法的继承
1.public protected
2.如果同名就隐藏。子类与父类各自用各自的成员。
3.重写:
a.把父类的方法设为虚方法,virtual。——父类说:这个方法可以被重写。
public virtual void Speak()
{
Console.WriteLine("我的名字叫"+_Name+",今年岁"+_Age+"了");
}
b.在子类中,使用override来重写父类中的方法。——子类确认我重写这个方法。
public override void Speak()
{
Console.WriteLine("我是一个女人,名字叫" + Name + ",今年" + Age + "岁");
}
class Program
{
static void Main(string[] args)
{
NvRen n = new NvRen(); //成员变量:如果同名就隐藏。子类与父类各自用各自的成员。
n.Speak();
Ren r = new Ren(); //属性:如果同名就隐藏。子类与父类各自用各自的成员。
r.Speak();
r = n; //输出的会是什么呢?
r.Speak(); //
Console.ReadLine();
}
}
注意: 1.如果父类方法中没有声明virtual,子类中有override重写它。会报错。
2.如果父类中声明了virtual,子类中没有override去重写它,不会报名,但会被隐藏。
3.虚方法一虚到底。子类即使override父类的虚方法,子类的这个方法依然还是虚方法。
增加一个类:
class Girl : NvRen
{
private string _School;
public string School
{
get { return _School; }
set { _School = value; }
}
public override void Speak()
{
Console.WriteLine("我是一名女生,正在"+_School+"读书");
}
}
class Program
{
static void Main(string[] args)
{
NvRen n = new NvRen(); //成员变量:如果同名就隐藏。子类与父类各自用各自的成员。
n.Speak();
Ren r = new Ren(); //属性:如果同名就隐藏。子类与父类各自用各自的成员。
r.Speak();
Girl g = new Girl();
r = g; //输出的会是什么呢?
r.Speak(); //
Console.ReadLine();
}
}
}
(四)构造函数的继承
1.如果父类没有写构造函数,或者父类构造函数没有参数。子类的构造函数没有特殊要求。
2.如果父类的构造函数(构造函数可能有好几个)都有参数,子类构造函数必须向父类构造函数中传递值。base();
public NvRen(string name, int age) : base(name, age)
{
}
注:在子类中调用父类的方法时,可以使用base.xxxx来调用。一般用调用父类被重写的方法。
base--父类对象。
this--当前对象。this.XXXX
标签:
原文地址:http://www.cnblogs.com/likaixuan/p/4465891.html