返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#之继承实现
  • 450
分享到

C#之继承实现

2024-04-02 19:04:59 450人浏览 独家记忆
摘要

目录一.继承的类型1.实现继承和接口继承2.多重继承3.结构的继承二.继承的实现1.虚方法2.隐藏方法3.调用函数的基类版本4.抽象类和抽象函数5.密封类和密封方法6.派生类的构造函

一.继承的类型

面向对象编程中,有两种截然不同继承类型:实现继承和接口继承

1.实现继承和接口继承

*实现继承:表示一个类型派生于基类型,它拥有该基类型的所有成员字段和函数。在实现继承中,派生类型采用基类型的每个函数的实现代码,除非在派生类型的定义中指定某个函数的实现代码。在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,可以使用这种类型的继承。
*接口继承:表示一个类型只继承了函数的签名,没有继承任何的代码。在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。

2.多重继承

C#不支持多重继承,但C#允许类型派生自多个接口————多重接口继承。这说明,C#类可以派生自另一个类和任意多个接口。更准确的说,因为System.Object是一个公共的基类,所以每个C#(除Object之外)都有一个基类,还可以有任意多个接口。

3.结构的继承

使用结构的一个限制是结构不支持实现继承,但每个结构都自动派生自System.ValueType。不能编码实现类型层次的结构,但结构可以实现接口。

二.继承的实现

语法:

  class MyDreved:BaseClass
  {

  }

如果类或结构也派生自接口,则用逗号分隔列表中的基类和接口:

  class MyDreved:BaseClass,IIntenface1,IIntenface2
  {

  }

如果在类定义中没有指定基类,C#编译器就假定System.Object是基类。

1.虚方法

把一个基类函数声明为virtual,就可以在任何派生类中重写(override)该函数:

  class BaseClass
  {
    public virtual void VirtualMethod()
    {
      //
    }
  }

也可以把属性声明为virtual。对于虚属性或重写属性,语法与非虚属性相同,但要在定义中添加virtual关键字:

  public virtual string Name
  {
    get;set;
  }

C#中虚函数的概念与标准OOP的概念相同:可以在派生类中重写虚函数。在调用方法时,会调用该派生类的合适方法。在C#中,函数默认情况下不是虚的,但(除了构造函数)可以显式的声明为virtual。
在派生类中重写一个函数时,要使用override关键字显示声明:

  class MyDreved: BaseClass
  {
    public override void VirtualMethod()
    {
      //
    }
  }

成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。

2.隐藏方法

如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual和override,派生类方法就会隐藏基类方法。

class A 
{
    public void a()
    {
      Console.WriteLine('CLASS is A');
    } 
}

class B:A
{
    public void a()
    {
       Console.WriteLine('CLASS is B');
    }
}

class client 
{
    static void main()
    {
        B b=new B();
       A a=b;

       a.a();
          b.a();
    }
}

在大多数情况下,是要重写方法,而不是隐藏方法,因为隐藏方法会造成对于给定类的实例调用错误的方法。但是,C#语法会在编译时收到这个潜在错误的警告。
在C#中,要隐藏一个方法应使用new 关键字声明,这样在编译时就不会发出警告:

  class A
  {
    public void a()
    {
      Console.WriteLine('CLASS is A');
    }
  }

  class B:A
  {
    public new void a()
    {
       Console.WriteLine('CLASS is B');
    }
  }

3.调用函数的基类版本

C#可以从派生类中调用方法的基本版本:base.<MethodName>()

  class MyDreved: BaseClass
  {
    public override void VirtualMethod()
    {
      base.VirtualMethod();
    }
  }

可以使用base.<MethodName>()语法调用基类中的任何方法,不必从同一方法的重载中调用它。

4.抽象类和抽象函数

C#允许把类和函数声明为abstract.抽象类不能实例化,而抽象不能直接实现,必须在非抽象的派生类中重写。显然抽象函数也是虚拟的(尽管不需要提供virtual,实际上,也不能提供该关键字)。
如果类包含抽象函数,则该类也是抽象的,也必须声明为抽象的:

  abstract class Building
  {
    public abstract void Cal();
  }

抽象类中不能声明非抽象方法,但可以声明其它的非抽象成员。

5.密封类和密封方法

C#允许把类和方法声明为sealed。对于类,这表示不能继承该类;对于方法,表示不能重写该方法。

  sealed class A
  {

  }

  class B:A //报错
  {

  }

如果基类上不希望有重写的方法和属性,就不要把它声明为virtual.

6.派生类的构造函数

假定没有为任何类定义任何显示的构造函数,编译器就会为所有的类提供默认的初始化构造函数,在后台编译器可以很好的解决类的层次结构中的问题,每个类中的每个字段都会初始化为对应的默认值。
在创建派生类的实例时,实际上会有多个构造函数起作用。要实例化的类的构造函数本身不能初始化类,还必须调用基类中的构造函数。
构造函数的调用顺序是先调用Object,在按照层次结构调用基类的构造函数,由基类到父类,直到到达要实例化的类为止。在这个过程中,每个构造函数都初始化它自己的类中的字段。因为最先调用的总是基类的构造函数,所以派生类在执行过程中可以访问任何基类的成员,因为基类已经构造出来了,其字段也初始化了。

  • *在层次结构中添加无参数的构造函数 在层次结构中添加一个无参数的构造函数会替换默认的构造函数,所以在执行过程中,会默认调用基类中添加的无参数的构造函数。其它方面不变。
  • *在层次结构中添加带参数的构造函数 在层次结构中要调用这个带参数的构造函数,需要在父类的构造函数中显示调用:
public abstract class GenericCustomer
{
    private string name;

    public GenericCustomer()
    {
        name = "<no name>";
    }

    public GenericCustomer(string name)
    {
        this.name = name;
    }


    public string Name 
    { 
        get {return name;}
        set {name = value;}
    }

}

public class Nevermore60Customer : GenericCustomer
{
    private string referrerName;
    private uint highCostMinutesUsed;

    ublic Nevermore60Customer(string name) : this(name, "            <None>")
    {
    }

    public Nevermore60Customer(string name, string referrerName) : base(name)
    {
        this.referrerName = referrerName;
    }

    public string ReferrerName
    {
        get {return referrerName;}
         set {referrerName = value;}
    }

}

三. 修饰符

修饰符可以指定方法的可见性:如public或private,还可以指定一项的本质,如方法是virtual或abstract.

1.可见性修饰符

修饰符应用于说明
public所有类和成员任何代码可以访问
protected类的成员和内嵌类只有在类内部和派生类中访问
internal所有类和成员只有在类内部和包含它的程序集中访问
private类的成员和内嵌类只有在类内部访问
protected internal类的成员和内嵌类只有在类内部,派生类中和包含它的程序集中访问

不能把类定义为protected,private,protected internal,因为这些修饰符对于包含在名称空间中的类型没有意义。因此这些修饰符只能应用于成员。但是可以用这些修饰符定义嵌套的类(内嵌类,包含在其它类中的类),因为在这种情况下,类也具有成员的状态:

  public class OuterClass
  {
    protected class InnerClass
    {

    }
  }

2.其它修饰符

修饰符应用于说明
new函数隐藏函数
static所有成员静态
virtual函数成员可以由派生类重写
abstract类,函数抽象
override函数重写虚拟和抽象的成员
sealed类,方法,属性不能继承和重写
extern仅静态方法成员在外部用另一种语言实现

四.接口

  public interface IDisposable
  {
    void Dispose();
  }

声明接口在语法上和声明抽象类完全相同,但不允许提供任何成员的实现方式。抽象类可以提供除方法之外的其它成员的实现方式,比如属性。
一般情况下,接口只能包含方法,属性,索引器和事件的声明。
不能实例化接口,接口即不能有构造函数,也不能有字段。接口定义也不允许包含运算符重载。
在接口中不允许声明关于成员的修饰符。接口成员总是公有的,不能声明为虚拟和静态。如果需要,在实现的类中声明。
实现接口的类必须实现接口的所有成员。
接口可以彼此继承,其方式与类的继承方式相同。

到此这篇关于C#之继承实现的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#之继承实现

本文链接: https://lsjlt.com/news/145567.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#之继承实现
    目录一.继承的类型1.实现继承和接口继承2.多重继承3.结构的继承二.继承的实现1.虚方法2.隐藏方法3.调用函数的基类版本4.抽象类和抽象函数5.密封类和密封方法6.派生类的构造函...
    99+
    2024-04-02
  • C++继承与虚继承怎么实现
    这篇文章主要介绍“C++继承与虚继承怎么实现”,在日常操作中,相信很多人在C++继承与虚继承怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++继承与虚继承怎么实现”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • C++多继承(多重继承)的实现
    在前面的例子中,派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有...
    99+
    2023-05-16
    C++多继承 C++多重继承
  • C++详细讲解继承与虚继承实现
    目录继承的概念及定义概念:定义:继承关系和访问限定符总结基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承虚继承原理继承的...
    99+
    2024-04-02
  • C#继承怎么实现
    本篇内容主要讲解“C#继承怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#继承怎么实现”吧!一.继承的类型在面向对象的编程中,有两种截然不同继承类型:实现继承和接口继承1.实现继承和接...
    99+
    2023-06-29
  • C#怎么实现多重继承
    这篇文章主要讲解了“C#怎么实现多重继承”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现多重继承”吧!C# 多重继承多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能...
    99+
    2023-06-17
  • C#中的继承怎么实现
    在C#中,继承是通过使用关键字" : "来实现的。下面是一个简单的示例,演示了如何在C#中实现继承: // 定义...
    99+
    2024-03-06
    C#
  • 深入理解C#之继承
    目录C#之继承能够阻止某个类被其他类继承吗?那么我们该如何获得基类的构造函数和自身的构造函数呢?都定义有构造函数时,那么执行顺序会怎样呢?总结C#之继承 继承、封装和多态是面向对象编...
    99+
    2024-04-02
  • 如何实现C#继承与C#多态
    这篇文章主要讲解了“如何实现C#继承与C#多态”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现C#继承与C#多态”吧!在C#中实现OOP思想,丝毫不逊色于Java,下面我通知两句话来帮...
    99+
    2023-06-17
  • Java之继承
    继承 继承为什么使用继承继承是什么继承的语法访问父类成员访问父类成员变量访问父类成员方法 super关键字子类构造方法super和this异同分别的使用方法 继承的方式final关键字 作者简介: zoro-1,...
    99+
    2023-08-16
    java 开发语言 程序人生
  • C++继承的实现原理是什么
    C++继承的实现原理是通过派生类继承基类的成员和方法。当一个派生类继承一个基类时,派生类会拥有基类的所有成员变量和成员函数。在内存中...
    99+
    2023-10-26
    C++
  • c#继承多个基类怎么实现
    在 c# 中,实现多重继承的方法是通过使用接口。一个类可以实现多个接口,从而继承来自不同基类的行为。需要注意的是,当接口定义了具有相同签名的相同方法时,需要使用显式实现来解决继承冲突(钻...
    99+
    2024-05-14
    c#
  • 一文读懂C++中的继承之菱形继承(案例分析)
    目录前言一、什么是多继承?1.单继承2.多继承二、菱形继承1.虚基类的引入2.虚基表的引入总结前言 我们上一篇说了世间万物都有一个继承体制,或多或少子类继承了父类的某些特征,但大多都...
    99+
    2024-04-02
  • C++ 函数继承详解:如何使用继承实现插拔式架构?
    函数继承允许派生类覆盖基类的函数,避免代码重复。实现方法:在派生类函数前使用 override 关键字。实战案例:插拔式架构中,插件类作为基类,派生类提供插件实现,通过 pluginma...
    99+
    2024-05-02
    c++ 函数继承
  • C++ 继承,虚继承(内存结构)详解
    目录普通的公有继承多重继承虚继承虚继承(菱形继承)总结普通的公有继承 class test1 { public: test1(int i) :num1(i) {} pri...
    99+
    2024-04-02
  • C++继承与菱形继承详细介绍
    目录继承的概念和定义基类和派生类之间的赋值继承中的作用域派生类的默认成员函数菱形继承继承和组合的区分与联系其余注意事项继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的...
    99+
    2024-04-02
  • php中怎么实现类继承和接口继承
    这篇文章将为大家详细讲解有关php中怎么实现类继承和接口继承,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、PHP类不支持多继承,也就是子类只能继承一个父...
    99+
    2024-04-02
  • C++中有哪些实现继承的方式
    C++中有哪些实现继承的方式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C++继承方式1.普通继承+父类无virtual函数若子类没有新定义virtual函数...
    99+
    2023-06-17
  • c++继承的实现方式有哪几种
    在C++中,有三种继承的实现方式:公有继承、私有继承和保护继承。 公有继承: 公有继承是最常用的继承方式。使用关键字"publi...
    99+
    2023-10-26
    c++
  • C++中继承的实现原理是什么
    C++中继承的实现原理是通过创建一个新的类(派生类)来继承已有的类(基类)的属性和方法。派生类可以访问基类中的非私有成员,并且可以扩...
    99+
    2024-02-29
    C++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作