(一)类的继承
继承是面向对象的编程的一种基本特性。 借助继承,能够定义可重用(继承)、扩展或修改父类行为的子类。 成员被继承的类称为基类。 继承基类成员的类称为派生类。
我们创建一个类A与一个类B,使其B继承自A,这样一个普通的继承就构造好了,类B拥有类A的所有字段和方法,也就是说类B也可以对其类A中的字段和方法进行修改和使用,但是不能将类A中的字段和方法消除。
class A
{
}
class B : A
{
}
因为继承只支持单一继承,也就是说,类只能继承自一个类,如果我们继承多个类的话程序时编译不了的,如图我们又创建了一个类C,使其类B同时继承类A和类B,可以看到提示类“B”不能具有多个基类:“A”和“C”。
同时子类的访问级别是不能超过父类的访问级别,可以持平或更低,可以看到我们分类的访问级别是internal而子类的是public,这种就会提示基类“A”的可访问性低于类“B”。
在调用的时候,我们可以使用父类来new一个子类出来,我们可以这样对子类B创建一个实例化对象出来,但是反之是不可以的,也就是说我们不能用子类B来对父类A创建一个实例化对象。
A b = new B();
如果我们父类A构造了一个构造器,需要传入一个参数,我们会看到报一个这样的错误。
我们只需要这样即可。同时为子类B构造一个构造器,使用关键字base向父类传一个值。
class A
{
public A(string n)
{
this.name = n;
}
public string name { get; set; }
}
class B : A
{
public B() : base("你好")
{
}
}
我们也可以这样来进行操作。
class A
{
public A(string n)
{
this.name = n;
}
public string name { get; set; }
}
class B : A
{
public B(string n) : base(n)
{
}
}
值得注意的是其实我们创建的所有类都继承自Object类,Object类是所有类的老祖宗。
class A : Object
{
}
(二) 类的访问级别
我们创建一个类库ClassLibrary1将其与classNa关联,并且在classNa中引用进来。
using ClassLibrary1;
ClassLibrary1中默认创建的一个类Class1,我们看到前面是没有加访问修饰符,其实是有一个默认的访问修饰符internal的。
namespace ClassLibrary1
{
class Class1
{
}
}
如果是这样的话,我们在classNa是对其创建不了实例化对象的,这里已经提示了Class1为不可访问,具有一定保护级别。
那么我们将访问级别改为public,那么我们在其他程序集中就可以自由访问了。
namespace ClassLibrary1
{
public class Class1
{
}
}
当我们在同一程序集中创建两个类如下
namespace ClassLibrary1
{
public class Class1
{
public string name { get; set; }
}
public class Class2 : Class1
{
public void Add()
{
Console.WriteLine(base.name);
}
}
}
class2继承自class1,我们可以获取到class1中的字段name,但是我们将字段name 的访问修饰符改为private,我们可以看到,提示具有一定保护级别。
如果我们只想要派生类(子类)访问该字段,不暴露给其他类,我们可以将访问修饰符修改为protected,这样我们子类可以访问到该字段,但是其他类访问不了该类。
namespace ClassLibrary1
{
public class Class1:Object
{
protected string name { get; set; }
}
public class Class2 : Class1
{
public void Add()
{
Console.WriteLine(base.name);
}
}
}
那么我们就可以总结一下
public所有程序集中都可以自由访问
internal在当前程序集中可以访问
private控制在当前类体中可以访问(就算是继承自也不能访问)
protected控制在父子类中访问(无论是不是同一程序集,只要有继承关系就可以访问)
(三)委托与Lambda表达式
委托定义了一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 其参数列表和返回类型匹配的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用,当我们把委托与Lambda表达式放在一起使用的时候,在定义一些具有简单返回值的时候,我们可以使用这种配合。
Func<int, int, int> func = new Func<int, int, int>((int a, int b) => { return a + b; });
Console.WriteLine(func(1,2));
我们使用Func关键字创建一个委托,需要传入两个int类型并且返回一个传入值相加的int类型,我们就可以使用这种方法,我们向其中传入1,2,现在我们将其打印出来。
当我们将委托与 Lambda表达式一起使用时,也可以减少一些不必要的代码,使其更加简洁,如下
Func<int, int, int> func =((a,b) => { return a + b; });
Console.WriteLine(func(1,2));
我们在等式后面直接跟 Lambda表达式,同样我们向其中传入1,2,现在我们打印出来,可以看到是一样的效果。