继承
继承是为了实现程序的复用,将父类的功能传递给子类,子类就可以省去重新定义的工作。
这一概念其实也跟面向对象紧密相关。面向对象就是将对象抽象出来,而不同的抽象层级就会得到不同的类。比如,大学生——学生——人——动物——生物,就是不断抽象的过程。越往上抽象,独有属性就越笼统,越少;越往下抽象就越具体,属性也就越丰富;而且下层的属性中必然包涵着上层的属性。大学生肯定有学生的属性,所以c#中的继承就是把上层的属性拿到下层来使用。程序可以这样使用:
public class Person
{
public string Name;
public int Age;
public void Eat()
{
//吃
}
public void Move()
{
//移动
}
}
public class Student : Person
{
public string StudentNumber;
public string Grade;
public void Study()
{
//学习
}
}
//测试
public class test
{
private void main()
{
Student stu = new Student();
stu.StudentNumber = "202201220301";
stu.Study();
//除了使用student类中的属性和方法,还能直接使用父类中的属性方法,如下:
stu.Name = "Lisa";
stu.Move();
}
}
继承的一些特点:
- 可传递性,可以传递继承,比如C从B继承,B从A继承,那C也从A继承;
- 单一性,一个派生类只能从一个基类继承,不能从多个基类继承,但可以通过接口实现继承多个基类;
- 访问修饰符影响,使用private定义的基类无法被继承;
- 基类中的构造函数无法直接被继承,要使用base继承;
- 基类对象可以引用派生类对象,也就是可以把派生类的实例赋值给基类的实例,那基类就可以使用派生类的方法和属性了。
多态
多态是同样的方法名,根据输入参数不同进行不同的处理,这是c#中非常常见的方式,比如调用系统方法,提示有几个重载的,那方法就是多态方法。
多态的三种存在情况:
- 重载,就是取相同的方法名,但使用不同类型的参数或者不同数量的参数,自动就构成重载,但是返回类型不同不构成重载。
public static void Write(string moduleName, string message, Exception ex) { log4net.ILog log = log4net.LogManager.GetLogger(moduleName); if (ex != null) { log.Error(message + ";" + ex.Message, ex); } if (!string.IsNullOrEmpty(message)) { log.Info(message); } log = null; } public static void Write(string moduleName, Exception ex) { //通过用两次moduleName,实现当前方法只需要两个参数,实现多态 Write(moduleName, moduleName, ex); }
-
重写,与继承密切相关,是在派生类中对基类的方法进行重写。一般是在基类中用关键字virtual声明一个虚方法,然后在派生类中使用override重写,就可以在不同派生类中实现不同功能。比如动物都有吃()这个方法,但是鸡的吃()是啄,狗的吃()是咬,蛇的吃()是吞,在派生类中重写吃(),就可以实现上述的表达。重写是多态的重要实现手段。
//基类中的方法 public virtual void Display() //基类Person中定义成虚拟方法,使用virtual关键字 { Console.WriteLine("{0}是{1}性,年龄为{2}", this._name, this._gender, this._age); } //派生类中的方法 public override void Display() //重写基类中的Display方法 { Console.WriteLine("这是一个学生:"); //在派生类中编写新代码 base.Display(); //调用基类的Display方法显示 }
-
隐藏,隐藏与重写基本相同,只是基类中的方法没使用virtual关键字定义,派生类中就只能使用new来隐藏基类的方法。
//紧接上方的代码 public new void Display(string no) //使用new隐藏基类 { Console.WriteLine("这是一个学生:"); base.Display(); //调用基类的Display方法 Console .WriteLine ("学生的学号是:{0}",no); }