zoukankan      html  css  js  c++  java
  • C#继承

    本人在于巩固基础知识,高手可以绕道

    我们先来看看微软中关于继承的叙述:类可以从其他类中继承。这是通过以下方式实现的:在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)

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

    C#的继承与 C++ 等语言一个重要的不同,就是只能从一个类中继承,这是开发者在权衡了从多个类C#继承的优势与劣势作出的结果。不过,可以从接口继承。另外,继承可传递。

    也可以在继承其他类的同时继承多个接口例如:

    public class ClassB : ClassA,Interface1,Interface2

    如果基类成员是protected那么只有继承他的子类可以访问,如果基本是sealed 那么表示他不可以被继承

    也可以继承一个抽象类

     public abstract class ClassC
    public class ClassD:ClassC

    C#继承中的重写

    • virtual 用在基类中,指定一个虚方法(属性),表示这个方法(属性)可以重写。
    • override 用在派生类中,表示对基类虚方法(属性)的重写。

    以上的基类和派生类都是相对的。B 是 C 的基类,也可以是 A 的派生类,B 中既可以对 A 中的 virtual 虚方法用 override 重写,也可以指定 virtual 虚方法供 C 重写。

    不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。为什么 override 也可以重写呢?因为基类中的 override 实际上是对基类的基类进行的重写,由于继承可传递,所以也可以对基类中 override 的方法进行重写。

    • override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。 

    不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。

    • 重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
    public class ClassA
        {
          
            public virtual void MethodA()//virtual关键词表示这个方法可以重写
            {
                Console.WriteLine("this is ClassA");
            }
    
        }
    public class ClassE:ClassA
        {
            public override void MethodA()
            {
                base.MethodA();//这个可以不要
    //下面就是你想要重写的部分 Console.WriteLine(
    "this is ClassE"); } }
      static void Main(string[] args)
            {
    
                ClassE e = new ClassE();
                e.MethodA();
    
    
            }
    
    
    
    

    ClassE继承了ClassA 同时也继承了他所有的成员包括这个虚拟方法,在ClassE中,我们重写了这个虚拟方法,添加新的东西,最后调用,调用中先执行基类的虚拟方法,然后执行你需要的重写的部分

    public ClassA(string field)
            {
                FieldA = field;
              
            }
    public ClassE(string field):base(field)
            {
                FieldA = field;
            }

        public override void MethodA()
        {

           Console.WriteLine(base.FieldA);
        }

     
       ClassE e = new ClassE("demo");
                e.MethodA();

    最后会输出一个: demo

    子类构造函数继承父类时首先会调用父类的构造函数

  • 相关阅读:
    新能源汽车产业发展规划(2021-2035年)
    Spire.Doc 生成长图
    【Kafka】单机Kafka测试
    【Linux】IO多路复用之select、poll、epoll模型
    【Linux】五种IO模型
    【Linux】零拷贝技术(Zero Copy)
    【Linux】系统相关概念
    【SpringBoot】SpringBoot 整合Redisson
    【Spring】SpringBoot + SpringSession + Redis 实现Session共享
    【SpringBoot】SpringBoot 整合Redis
  • 原文地址:https://www.cnblogs.com/jixinyu/p/4298633.html
Copyright © 2011-2022 走看看