c#基础知识梳理

三大特性,封装继承多态
封装是把字段封装为属性,通过get set访问器进行访问,目的是为了对获取值和设置值进行控制,包括对值的验证和处理,访问的权限控制,主要是为了安全,字段定义为public就可以随
意的获取和修改字段,无法保证数据安全

public class test{
    private string name;
    public string name{
        get{
            return name;
        }
        set{
            name=value;
        }
    }
}


访问修饰符有六种:public(公共,都能访问),protected(保护,当前类和当前类的子类访问),internal(内部,同一个程序集中的类可以访问),private(私有,当前类可以访问),
protected Internal(同一个程序集或当前类及当前类的子类),private protected(当前类或当前类的子类)
继承是类可以派生为子类,子类就是继承于父类,可以使用父类的成员变量和方法,是为了使代码复用,类是单一继承,只能继承一个父类,为了使用多重继承需要使用接口。

public class A{
    public virtual void F()
    {}
}
public class B:A
{
    public override void F()
    {}
}
public class C:A
{
    public override void F()
    {}
}


多个类继承同一个类,每个类都对父类进行重写产生的现象就是多态,说明继承是多态的基础

public class A{
    public void function()
    {}
}
public class B:A{
    public void function()
    {}
}


这时提示会把父类中的function方法隐藏,如果需要把父类方法隐藏,给子类function加上new
多态分为静态多态和动态多态,静态多态有运算符重载和函数重载,动态多态通过抽象类和虚方法实现
sealed是密封,有密封方法和密封类,主要是为了方式滥用继承,密封类不允许派生子类
密封类,此时B不能继承A,否则会报错

public sealed class A{
    
}
public class B{
}


密封方法,C类无法继承B类中的F2方法,另外修饰符的前后顺序没什么影响

public class A{
    public virtual void F()
    {}
    public virtual void F2()
    {}
}
public class B:A
{
    public override void F()
    {}
    public override sealed void F2()
    {}
}
public class C:B
{
    public override void F()
    {}
}


抽象类的特点:不能创建抽象类的实例,不能跟sealed同时使用,抽象方法只能放在抽象类中

申明类和实例类

    public class Class1
    {
        public virtual string test()
        {
            return "1";
        }
        public  string test2()
        {
            return "2";
        }
    }
    public class Class2: Class1
    {
        public override string test()
        {
            return "3";
        }
         public new string  test2()
        {
            return "4";
        }
    }
    public class Class3 : Class2
    {
        public new string test()
        {
            return "5";
        }
        public new string test2()
        {
            return "6";
        }
    }

调用

Class1 class2 = new Class2();//Class1为申明类,Class2为实例类
Class1 class3 = new Class3();
string num = class2.test();//显示3
num = class2.test2();//2
num = class3.test();//3
num = class3.test2();//2

先走的是申明类的方法,如果申明类的方法不是虚函数就直接执行,所以test2都是执行的Class1的方法

如果是虚函数,判断实例类的方法是否有override,如果有就执行实例类的方法,所以Class2.test执行的是Class2的test方法

如果实例类的方法中没有override就去找实例类的父类,所以Class3.test2执行的是Class2的test方法

如果是没有找到override重写的,就执行Class1.test方法

如果不想使用基类中的方法,就在实例化类的时候实例化你想用方法的类,比如Class3 class3=new Class3();

这块内容详细内容地址:https://blog.csdn.net/qq_33380252/article/details/87256301

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值