• C#基础复习第一部


    封装:隐藏代码实现 复用 修改方便
    继承:
    多态:

    面试是好解析面向对象
    最好立即拿周围的事务来说
    比如桌子
    先分析类:桌子和椅子
    他们都是家具
    所以定义一个家具类 它是怎么材料 这个就是属性
    它能做什么 这个就是方法 比如能坐 能放东西在上面

    然后定义一个椅子类 它应该是家具 所以继承自家具类
    它也有一个属性 它还有另外的属性 比如高度 等

    我们把椅子封装到一个类里面 然后通过这个类 我们就可以
    制作很多对象
    比如椅子1号 椅子2号 然后我们再定义一个person类
    它只要调用椅子的方法 就可以使用它的方法 我们无需
    知道椅子内内部是如何实现的

    因为所有椅子都有一个
    --------------------------------------------

    enum 星期{周日,周一,周二,周二......}
    --------------------------------------------

    internal 程序集里面访问
    public 引入命名空间就能访问
    private 类内部能访问
    protected 类内部和子类能访问
    

      


    --------------------------------------------
    this和构造方法

    public Person(string name):this(50,name)//这里调用另外一个构造方法 并且年龄是默认50
    {
    
    }
    public Person(int age,string name)
    {
    this.name = name;
    this.age = age;
    }
    

      

    this在方法中使用 代表它所在的类在堆里面的对象
    --------------------------------------------
    命名空间 虚拟的文件夹系统

    右击项目文件 属性 有个程序集名称 就是bin里面exe的名称
    默认命名空间和项目一样 我们修改项目名 但默认命名空间没有变 要手动修改

    输出类型 有程序集 和控制台应用程序
    命名空间和程序集名称 本身没有什么相关

    导入命名空间 using system.data;
    写命名空间
    namespace MySpace
    {
    class Person
    {

    }
    }

    在另一个命名空间里面 如果要想访问Person对象 那么要引入 using MySpace
    这样 我们就可以 new Person对象 Person mai = new Person();
    如果在另个命名空间里面有同名的类 那么我们访问的时候 就要 命名空间.类名

    在同一个命名空间里面 可以创建多个类 比如

    namespace MySpace
    {
    class Person
    {
    
    }
    
    Class Aminal
    {
    
    }
    }
    

      

    同一个项目下面 每个cs命名空间默认是一样的

    --------------------------------------------
    new 子类时候 先创建子类对象 调用子类的构造函数(此时还没有执行子类构造函数方法体)
    创建父类对象 调用父类构造函数 最后翻来执行子类的构造函数方法体代码

    显示调用父类构造方法 base()
    显示调用当前类的另外构造函数

    public Person(string name):this(50,name)//这里调用另外一个构造方法 并且年龄是默认50
    {
    
    }
    public Person(int age,string name)
    {
    this.name = name;
    this.age = age;
    }
    

      

    --------------------------------------------
    里氏替换原则-子类可以替换父类的位
    父类 子类
    Person p = new Student()
    p.Say();//此时会调用父类类的say方法
    但 如果父类没有say方法 那么会报错 因为父类的类型指针 只会找父类的的成员

    如果我们想调用子类的 那么就要把p转换为student

    student s = p as student;

    当创建一个子类对象 声明的是父类对象 那么只能调用父类的方法
    但当创建的子类对象 声明的子类对象 那么先看子类对象中是否有该方法 如果没有则调用父类的 如果父类也没有 则出错
    --------------------------------------------
    LSP里氏替换原则

    不能将父类对象 强制转换为子类对象
    子类 0 = (子类) new 父类() 这样是错的
    除非你当前对象 本来就是一个子类
    比如

    Pserson p = new Student();
    Student s = (Student)c;
    s.Say();
    
    Pserson p = new Teacher();
    子类可以隐式转换为父类的
    
    Teacher t = (Teacher)p;
    父类可以强转成子类
    
    is 和as
    typeA is typeB 仅判断
    typeA as typeB 先判断,在转换
    

      

    --------------------------------------------
    简单工厂模式

    static Person GetPerson(string typeStr)
    {
    switch(typeStr)
    {
    case "teacher":
    return new Teacher();
    case "Student":
    return new Student();
    default:
    return new Person();
    }
    }
    
    static void TestSimpleFactory()
    {
    Pserson p = GetPerson("Teacher");
    p.SayHi();
    }
    

      

    -----------------------------------------------
    多态 (方法重写)
    三个条件
    1.有继承关系
    class Student:Person

    2.子类方法重写父类方法
    Person 中写一个虚方法 可以被子类重写

    public virtual void SayHi()
    {
    consoloe.....
    }
    
    Student 中 重写该方法
    public override void SayHi()
    {
    dd...
    }
    

      

    3.父类引用指向子类对象
    Person p = new Student();
    p.Say();//这时候 它真的会调用子类的方法
    --------------------------------------------
    AS IS

    Person p = new Student();
    if(p is Student)//判断p是否是Student的子类或者就是Student
    {
    Student s = (Student)p;
    }
    
    如果用as 
    Student s = p as Student;
    

      

    --------------------------------------------
    抽象类
    抽象类里面可以有非抽象方法 

    public abstract class AbstractClass
    {
    pulic void SayHi()
    {
    
    }
    
    public abstract void AbsMethod();//抽象方法
    }
    

      

    abstract要写到class关键字外面
    --------------------------------------------
    abstract class Class1
    {
    public void Say()
    {
    Console.WriteLine("抽象类里面可以没有抽象方法");
    }
    }
    //但抽象类不能new
    --------------------------------------------
    抽象类不能实例化(不能new)
    抽象类可以有抽象方法 也可以没有
    一般类不能有抽象方法
    谁继承了抽象类 要么也写成抽象类 要么实现抽象类的所有抽象方法
    --------------------------------------------
    接口也是引用类型 类似类 和抽象类相似之处 三点
    1、不能实例化
    2、包括未实现的方法声明
    3、子类必须实现未实现的方法
    --------------------------------------------
    接口的一些常见错误

    private interface Interface1
    {
    }
    错误 1 命名空间中定义的元素无法显式声明为 private、protected 或 protected internal
    --------------------------------------------
    interface Interface1
    {
    void Say();
    }
    错误 2 接口中的方法 不能有public修饰 private 等

    --------------------------------------------
    interface Interface1
    {
    void Say()
    {
    Console.WriteLine("接口中可以有方法实现???");
    }
    }
    错误 3 “ConsoleApplication1.Interface1.Say()”: 接口成员不能有定义

    --------------------------------------------
    父类方法 如果没有标记位virtual
    子类override这个方法 那么可能会错

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    Person p = new Student();
    p.SayHi();
    
    Console.ReadKey();
    }
    }
    
    class Person
    {
    public void SayHi()
    {
    Console.WriteLine("person.sayhi");
    }
    }
    
    class Student:Person
    {
    public override void SayHi()
    {
    Console.WriteLine("student.sayHi");
    }
    }
    }
    

      

    错误 1“ConsoleApplication1.Student.SayHi()”: 继承成员“ConsoleApplication1.Person.SayHi()”未标记为 virtual、abstract 或
    override,无法进行重写

    --------------------------------------------
    虚方法 和抽象方法 区别
    1、虚方法必须有实现 抽象方法 必须没有实现
    2、抽象方法必须在抽象类中声明,虚方法可以出现在抽象类中
    3、抽象方法必须在子类中重写,虚方法可以被重写

    实现多态的主要手段
    1 虚方法virtual
    2 抽象方法abstract
    3 接口

    关于虚方法需要注意的几点
    1 父类如果有方法需要让子类重写 则可以将该方法标记为virtual
    2 虚方法在父类中必须实现,那片是空实现
    3 虚方法子类可以重写override 也可以不重写
    不重写 就没有多态 调用的时候 父类的指针类型则调用父类的 子类的指针类型则调用子类的

    --------------------------------------------
    new关键字 和overr visual

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    Person p = new Student();
    p.SayHi();//由于子类重写了 所以调用子类对象 体现多态
    
    Person p1 = new Teacher();
    p1.SayHi();//直接调用父类的方法
    
    Teacher t = new Teacher();
    t.SayHi();//这里直接调用子类的 但如果子类方法没有new 则可能出现警告
    Console.ReadKey();
    }
    }
    
    class Person
    {
    public virtual void SayHi()
    {
    Console.WriteLine("person.sayhi");
    }
    }
    
    class Student:Person
    {
    public override void SayHi()
    {
    Console.WriteLine("student.sayHi");
    }
    }
    
    class Teacher:Person
    {
    public new void SayHi()
    {
    Console.WriteLine("teacher.sayhi");
    }
    //上面那里如果没有new 则会警告 new的作用是 隐藏父类的方法 因为父类也有同样的方法 而且是虚方法virtual
    //加个new的意思是 子类的这个方法 是子类新的方法 不是重写父类的方法
    
    }
    }
    

      

  • 相关阅读:
    zhanwei
    站位
    Web前端开发:SQL Jsp小项目(二)------添加修改
    Web前端开发:SQL Jsp小项目(一)
    JDBC(用Eclipse操作数据库Oracle)的基础操作集合
    Thread多线程stopSleep顺序问题
    IO流详解之代码详解
    IO流详解(半教材类型)
    用JQuery编写textarea,input,checkbox,select
    Java编写ArrayBasic制作一个简单的酒店管理系统
  • 原文地址:https://www.cnblogs.com/maijin/p/2689777.html
Copyright © 2020-2023  润新知