关于C#继承的简单应用代码分析

比如,现在有一些图形,需要计算他们的面积,计算面积的方法都不一样,可以这么做

声明一个抽象类

//基类
    abstract class Shape
    {
        //抽象方法 计算面积
        public abstract double ComputerArea();

    }

声明子类

//子类 继承Shape 实现抽象方法
    class Circle : Shape
    {
        private double _radius;

        //构造函数
        public Circle(double radius) => _radius = radius;

        //实现抽象方法
        public override double ComputerArea()
        {
            return _radius * _radius * Math.PI;
        }
    }

    //子类 继承Shape 实现抽象方法
    class Rectangle : Shape
    {

        private double _width;

        private double _height;

        //构造函数
        public Rectangle(double width, double height)
        {
            _width = width;
            _height = height;
        }
        //实现抽象方法
        public override double ComputerArea()
        {
            return _width * _height;
        }
    }

    //子类 继承Shape 实现抽象方法
    class Triangle : Shape
    {

        private double _bottom;

        private double _height;

        //构造函数
        public Triangle(double bottom, double height)
        {
            _bottom = bottom;
            _height = height;
        }
        //实现抽象方法
        public override double ComputerArea()
        {
            return _bottom * _height / 2;
        }
    }

声明计算类

//计算类
    class Calculate
    {
        //传入一个父类作为参数,调用方法
        public void Calc(Shape shape)
        {

            Console.WriteLine($"{shape.GetType().Name}的面积:{shape.ComputerArea()}");
        }
    }

测试

class Program
    {
        static void Main(string[] args)
        {
            var circle = new Circle(5);
            var rect = new Rectangle(5, 10);
            var triangle = new Triangle(6, 8);

            var calc = new Calculate();

            calc.Calc(circle);
            calc.Calc(rect);
            calc.Calc(triangle);
        }
    }

运行结果

实际上 如果是只有这个方法要实现的话,继承接口也是可以的!

实例扩展:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/**
 * 假设我们公司有两种程序员:
 * java程序员指的是用java语法写程序的程序员,用Jpro这个类表示;
 * C#程序员指的是用C#语法写程序的程序员,用Cpro这个类来表示。
 * 每个类都有一个WriteCode()方法。
 * 都属于程序员,用Programmer这个类表示。
 * 现在公司来了一个项目,要求派某个程序员写一个程序。
 */
namespace inheritApplication
{
  //程序员类(基类)
  class Programmer
  {
    public string name = "我是程序员";
  }
  //java程序员类
  class Jpro
  {
    public string name = "java程序员";
    public string language = "我用java语法写代码";
  }
  //C程序员类
  class Cpro
  {
    public string name = "C#程序员";
    public string language = "我用C#语法写代码";
  }
  //编写项目类
  class Pro : Programmer //继承基类
  {
    public void WriteProgram(Jpro program) //继承java程序员类
    {
      Console.WriteLine("" + program.name + ":" + name + "," + program.language + "");
    }
    public void WriteProgram(Cpro program)
    {
      Console.WriteLine("" + program.name + ":" + name + "," + program.language + "");
    }
  }
  //主程序
  class Program
  {
    static void Main(string[] args)
    {
      Pro p = new Pro();
      Jpro p1 = new Jpro();
      p.WriteProgram(p1);
      Cpro p2 = new Cpro();
      p.WriteProgram(p2);
      Console.ReadKey();
    }
  }
}

到此这篇关于关于C#继承的简单应用代码分析的文章就介绍到这了,更多相关C#继承的简单应用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C#面相对象编程中的继承特性

    继承(加上封装和多态性)是面向对象的编程的三个主要特性(也称为"支柱")之一. 继承用于创建可重用.扩展和修改在其他类中定义的行为的新类.其成员被继承的类称为"基类",继承这些成员的类称为"派生类".派生类只能有一个直接基类.但是,继承是可传递的.如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员. 注意 结构不支持继承,但可以实现接口. 从概念上来

  • C#类继承中构造函数的执行序列示例详解

    前言 大家都知道类的继承规则: 1.派生类自动包含基类的所有成员.但对于基类的私有成员,派生类虽然继承了,但是不能在派生类中访问. 2.所有的类都是按照继承链从顶层基类开始向下顺序构造.最顶层的基类是System.Object类,所有的类都隐式派生于它.只要记住这条规则,就能理解派生类在实例化时对构造函数的调用过程. 不知道大家在使用继承的过程中有木有遇到过调用构造函数时没有按照我们预期的那样执行呢?一般情况下,出现这样的问题往往是因为类继承结构中的某个基类没有被正确实例化,或者没有正确给基类构

  • 浅谈C# 类的继承

    继承 一个类可以继承自另一个类.在 C#中,类与类之间只存在单一继承.也就是说,一个类的直接基类只能有一个.当类与类之间实现继承的时候,子类可以将它的直接基类的所有成员当做自己的成员,除了类的静态构造方法.实例构造方法和析构方法.但是,虽然基类的所有成员都可以当做子类的成员,但是如果基类的成员设置了不同的访问权限,则派生类可以访问的成员也随之不同.C#的继承是可以传递的,如果类C从类B派生,而类B从类A派生,则类C将继类B的所有成员,也继承类A的所有成员(各个基类的静态构造方法.实例构造方法和析

  • C#子类对基类方法的继承、重写与隐藏详解

    前言 提起子类.基类和方法继承这些概念,肯定大家都非常熟悉.毕竟,作为一门支持OOP的语言,掌握子类.基类是学习C#的基础.不过,这些概念虽然简单,但是也有一些初学者可能会遇到的坑,我们一起看看吧. 子类继承基类非私有方法 首先我们看最简单的一种,子类继承自基类,但子类对继承的方法没有任何改动 class Person { public void Greeting() { Console.WriteLine("Hello, I am Person"); } } class Employ

  • c# 如何用组合替代继承

    如果问面向对象的三大特性是什么,多数人都能回答出来:封装.继承.多态. 继承 作为三大特性之一,近来却越来越不推荐使用,更有极端的语言,直接语法中就不支持继承,例如 Go.这又是为什么呢? 为什么不推荐使用继承? 假设我们要设计一个关于鸟的类. 我们将"鸟类"定义为一个抽象类 AbstractBird.所有更细分的鸟,比如麻雀.鸽子.乌鸦等,都继承这个抽象类. 大部分鸟都会飞,那我们可不可以在 AbstractBird 抽象类中,定义一个 Fly() 方法呢? 答案是否定的.尽管大部分

  • C# 面向对象三大特性:封装、继承、多态

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了代码的重用机会,增加了程序开发的速度,将具备独立性特制的程序代码包装起来,修改部分程序代码时不至于会影响到程序的其他部分. 1.封装 每个对象都包含它进行操作所需要的所有信息,封装只公开代码单元的对外接口,而隐藏其具体实现,尽量不对外公开代码.使用封装有很多好处,从设计角度来讲,封装可以对外屏蔽一些

  • 关于C#继承的简单应用代码分析

    比如,现在有一些图形,需要计算他们的面积,计算面积的方法都不一样,可以这么做 声明一个抽象类 //基类 abstract class Shape { //抽象方法 计算面积 public abstract double ComputerArea(); } 声明子类 //子类 继承Shape 实现抽象方法 class Circle : Shape { private double _radius; //构造函数 public Circle(double radius) => _radius = r

  • python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析

    在PyQt中常用的图像类有四种,QPixmap,QImage,QPicture,QBitmap 类型 描述 QPixmap 专门为绘图设计的,在绘制图片时需要使用QPixmap QImage 提供了一个与硬件无关的图像表示函数,可以用于图片像素级访问 QPicture 是一个绘图设备类,它继承自QPainter类,可以使用QPainter的begin()函数在QPicture上绘图,使用end()函数结束绘图,使用QPicture的save()函数将QPainter所使用的绘图指令保存在文件中

  • java中继承测试代码分析

    继承:可以基于已经存在的类构造一个新类.继承已经存在的类就可以复用这些类的方法和域.在此基础上,可以添加新的方法和域,从而扩充了类的功能. public class ExtendsStu { /*动物类:动物都可以动 * 1.Dog 2.Cat * 在java中,子类可以继承父类的属性和功能; * 继承关系的指定: 子类 extends 父类 * 不能被继承的资源: * 1.子类不能继承父类的构造方法,而且必须调用一个父类的构造器(因为生成子类对象的时候会初始化父类属性) * 2.私有的资源不能

  • python scrapy简单模拟登录的代码分析

    1.requests模块.直接携带cookies请求页面. 找到url,发送post请求存储cookie. 2.selenium(浏览器自动处理cookie). 找到相应的input标签,输入文本,点击登录. 3.scrapy直接带cookies. 找到url,发送post请求存储cookie. # -*- coding: utf-8 -*- import scrapy import re class GithubLoginSpider(scrapy.Spider): name = 'githu

  • Java的RTTI和反射机制代码分析

    RTTI,即Run-Time Type Identification,运行时类型识别.运行时类型识别是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息.RTTI能在运行时就能够自动识别每个编译时已知的类型. 很多时候需要进行向上转型,比如Base类派生出Derived类,但是现有的方法只需要将Base对象作为参数,实际传入的则是其派生类的引用.那么RTTI就在此时起到了作用,比如通过RTTI能识别出Derive类是Base的派生类,这样就能够向上转型为Derived.类似的,

  • Android Fragment 和 FragmentManager 的代码分析

    这两天在研究插件化编程,在使用 Fragment 碰到了一些问题,于是查看源码,顺便分析了一下 Fragment 和 FragmentManager 以及其他几个 API 的原代码,看看他们是怎么工作的. 我们知道 Fragment 有个 onCreateView() 方法,这个方法在 Fragment 创建 View 的时候被调用,并且返回一个 View 对象.那么 onCreateView 在什么时候被调用呢,咱们在 Fragment 这个类里找到了一个方法,performCreateVie

  • hibernate存取json数据的代码分析

    一.场景 public class OrderModel { private List<String> favorableDescList; } 订单中会存储一些优惠信息,方便页面展示时使用,如: 1.满100减50 2.参与[老会员真情回馈--精品课程体验活动],仅需支付200.00学币 3.[Oracle + PL/SQL 实战]套装课程的[抢购]活动,优惠120.00学币 --等等 如图所示,我们在页面给用户展示他们参与的优惠信息: 二.分析 如上优惠信息有如下特点: 1.只用于展示,不

  • php微信公众平台示例代码分析(二)

    一.摘要 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下. 二.获取代码 微信官网:http://xiazai.jb51.net/201612/yuanma/phpwxsample(jb51.net).rar 三.分析代码 完整代码如下: <?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj =

  • JavaWeb 文件的上传和下载功能简单实现代码

    一.文件的上传和下载 1.文件上传的原理分析 1.文件上传的必要前提: a.提供form表单,method必须是post           b.form表单的enctype必须是multipart/form-data           c.提供input type="file"类的上传输入域 2.enctype属性 作用:告知服务器请求正文的MIME类型(请求消息头:Content-Type作用是一致的)      可选值: application/x-www-form-urlen

  • Java语言求解完美数代码分析

    1.概念 首先我们理解一下,什么叫做完美数? 问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数.简称"完数" 例如, 6=1+2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+248 8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064 按照完数的定义,其实用程序求解完数并不是太难,先求解出这个数的所有真因子,然后相加,判断是否等于它本身即可.但是,在这个数

随机推荐