c#回炉重造(五)类的继承,类的访问级别,委托与Lambda表达式

本文介绍了面向对象编程中的继承机制,包括单一继承、访问级别控制(public、internal、private、protected),以及委托和Lambda表达式的结合应用,展示了如何利用这些特性简化代码。
摘要由CSDN通过智能技术生成

(一)类的继承

继承是面向对象的编程的一种基本特性。 借助继承,能够定义可重用(继承)、扩展或修改父类行为的子类。 成员被继承的类称为基类。 继承基类成员的类称为派生类

我们创建一个类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,现在我们打印出来,可以看到是一样的效果。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值