设最底层的基类为Shape,Shape有周长和面积,圆Circle和椭圆Ellipse继承于Shape,设置计算周长的接口为circum(),计算面积的接口为area()。继承图表如下:

图(1) Shape、Circle和Ellipse之间的继承图表
  用R语言里的S4结构,可以很方便地实现接口和继承,详细代码如下:
  //S4.R  

# part1 -------------------------------------------------------------------
##定义基类Shape
setClass("Shape",slots = list(name="character"))##定义圆形类Circle,继承Shape
setClass("Circle",contains = "Shape",slots = list(radius="numeric"),prototype = list(radius=1))
##验证radius大于0
setValidity("Circle",function(object){if(object@radius <= 0) stop("Radius is negative")
})##定义计算面积的接口
setGeneric("area",function(obj,...) standardGeneric("area"))##实现面积接口
setMethod("area","Circle",function(obj,...){print("Area Circle Method")  pi * obj@radius^2
})##定义周长的接口
setGeneric("circum",function(obj,...) standardGeneric("circum"))##实现周长接口
setMethod("circum","Circle",function(obj,...){2 * pi *obj@radius
})##创建两个圆的实例---------------#
c1 <- new("Circle",name="c1")
c2 <- new("Circle",name="c2",radius=5)
# c1; c2##计算两个圆的面积
area(c1)
area(c2)##计算两个圆的周长
circum(c1)
circum(c2)# part2 -------------------------------------------------------------------
##定义椭圆类Ellipse, 继承Shape
setClass("Ellipse",contains = "Shape",slots = list(radius="numeric"),prototype = list(radius = c(1,1)))##验证椭圆的半径
setValidity("Ellipse",function(object) {if (length(object@radius) != 2 ) stop("It's not Ellipse.")if (length(which(object@radius<=0))>0) stop("Radius is negative.")
})##计算椭圆的面积
setMethod("area","Ellipse",function(obj,...){print("Area Ellipse Method")  pi * prod(obj@radius)
})##计算椭圆的周长
setMethod("circum","Ellipse",function(obj,...){cat("Ellipse Circum: \n")  2*pi * sqrt((obj@radius[1]^2 + obj@radius[2]^2)/2 )
})##创建椭圆的两个实例---------------------#
e1 <- new("Ellipse",name="e1");
e2 <- new("Ellipse",name="e2",radius=c(5,1))##计算两个椭圆的面积
area(e1)
area(e2)##计算两个椭圆的周长
circum(e1)
circum(e2)

  效果如下:

图(2) 求周长与面积

  方法二:当椭圆的长半径和短半径相等时,radius的两个值相等,形成的图形为圆形。利用这个特点,我们就可以重新设计圆与椭圆的关系。即椭圆是圆的父类,圆就是椭圆的子类。代码如下:
  //S4a.R  


# part1 -------------------------------------------------------------------
##面向对象
##Shape --> Ellipse -->Circle
##定义基类Shape
setClass("Shape",slots = list(name="character",shape="character"))
##定义获取图形的种类接口
setGeneric("getShape",function(obj,...) standardGeneric("getShape"))
##实现获取图形的种类接口
setMethod("getShape","Shape",function(obj,...){cat(obj@shape,"\n")
})##定义椭圆类Ellipse,继承Shape
setClass("Ellipse", contains = "Shape",slots = list(radius="numeric"),prototype = list(radius=c(1,1),shape="Ellipse"))
##定义圆形Circle, 继承Ellipse
setClass("Circle",contains = "Ellipse",slots = list(radius="numeric"),prototype = list(radius=1, shape="Circle"))##定义area接口
setGeneric("area",function(obj,...) standardGeneric("area"))
##定义circum接口
setGeneric("circum",function(obj,...) standardGeneric("circum"))##area接口的Ellipse实现
setMethod("area","Ellipse",function(obj,...){cat("Ellipse Area: \n")pi*prod(obj@radius)
})##area接口的Circle实现
setMethod("area","Circle",function(obj,...){cat("Circle Area: \n")  pi*obj@radius^2
})##circum接口的Ellipse实现
setMethod("circum","Ellipse",function(obj,...){cat("Ellipse Circum: \n")2*pi*sqrt((obj@radius[1]^2 + obj@radius[2]^2)/2)
})##circum接口的Circle实现
setMethod("circum","Circle",function(obj,...){cat("Circle circum: \n")2*pi*obj@radius
})##创建实例
e1 <- new("Ellipse",name="e1",radius=c(2,5))
c1 <- new("Circle",name="c1",radius=2)##计算面积
area(e1)
area(c1)##计算周长
circum(e1)
circum(c1)##获取图形的类型
getShape(e1)
getShape(c1)

用面向对象方法实现求圆和椭圆的周长与面积相关推荐

  1. C++给出圆的半径,求圆的直径、周长和面积

    C++给出圆的半径,求圆的直径.周长和面积 给出圆的半径,求圆的直径.周长和面积.输入圆的半径实数 r ,输出圆的直径.周长.面积,每个数保留小数点后4位. 输入:         包含一个实数 r( ...

  2. Python 输入圆的半径,求圆的直径、周长和面积

    输入圆的半径,求圆的直径.周长和面积.(圆周率取值为3.14) r=int(input('请输入圆的半径:')) PI=3.14 z=2*r c=2*PI*r s= PI*(r**2) print(' ...

  3. 【C语言】已知圆直径,求圆的半径、周长和面积

    前言 博主简介:本人是计算机专业,大二学生. 博客主要记录一些代码,主要是语言语法和数据结构方面. 希望和大家一起学习,一起加油,一起进步! 文章目录 前言 代码 运行截图 代码 #include&l ...

  4. python输入矩形的长和宽、求周长_输入矩形的长和宽,求出该矩形的周长和面积...

    01.1.上机内容:C++程序的编写和运行 02. 03.上机目的:编程序,输入数值,输出星期. 04. 05.我的程序:/*输入矩形的长和宽,求出该矩形的周长和面积*/ 06. 07.2./* 08 ...

  5. 椭圆的周长与面积_来自一张老外的作业纸

            高中搞了那么久解析几何,翻来翻去那么久的圆锥曲线,居然没考虑过椭圆的周长面积,实在罪过罪过,其实面积是考虑过的,长短周同的时候就变成圆面积公式了. 今天看到老外的一张作业纸,里面内容如 ...

  6. java编写圆的半径和周长,编写程序,其中用户将圆的半径作为整数并打印圆的直径,周长和面积...

    我写了这个程序,然而,我不知道我的错误在哪里.当我尝试在DOS上运行它时,我收到此错误: Unit2Circle.java:26:错误:已经定义了变量半径 方法main(String [])int r ...

  7. 创建一个Rectangle类。 添加两个属性width、height,分别表示宽度和高度,添加计算矩形的周长和面积的方法。测试输出一个矩形的周长和面积。

    [Java]创建一个Rectangle类 添加两个属性width.height,分别表示宽度和高度,添加计算矩形的周长和面积的方法.测试输出一个矩形的周长和面积. /*作者:龙蝶 *日期:2020年4 ...

  8. JavaScript输入圆的半径计算周长及面积

    JavaScript输入圆的半径计算周长及面积 <!doctype html> <html> <head> <meta charset="utf-8 ...

  9. 圆的直径、周长和面积

    2982 PI为3.1415926 输入 输入只有一行,一个小数表示半径. 输出 输出只有一行,分别为圆的直径.周长和面积,分别用空格隔开,要求精确到小数点后两位. #include<stdio ...

最新文章

  1. 为Visual Studio添加配色方案
  2. 「软件」2.0时代已经到来,你需要这样的开发工具
  3. 题目1465:最简真分数
  4. sap 与 sap business one 和国内软件的比较
  5. MySQL第10天:MySQL索引优化分析之索引介绍
  6. HTML基础_Day03
  7. qgraphicsview鼠标移动图片_如何在中间鼠标的QGraphicsView中滚动QGraphicsScene?
  8. FPGA+NIOS2 Verilog+C 实现一个计算器
  9. java数据类型和运算优先级
  10. dataset__getitem___【小白学PyTorch】3.浅谈Dataset和Dataloader
  11. ABBYY PDF Transformer+功能概述
  12. android 按钮复用,Android Button 自带阴影效果另一种解决办法
  13. 硬件之OC、OD、推挽解释
  14. 他,用了14年,从初代豆瓣工程师到AI公司CTO,创业心一直未变
  15. php给图片添加水印图片,PHP实现给图片添加文字水印
  16. 服务器托管的费用介绍
  17. safenet 超级狗 java调用 小计
  18. 正则类:判断一个字符串是否全是数字
  19. 狂汗!VOD点播系统漏洞解析,***电影网站!
  20. angular打包文件目录及访问地址

热门文章

  1. 小辣椒安卓机器人无命令_小辣椒 GM-Q5+手机怎么双清?_安卓手机双清刷机图解说明...
  2. videojs播放m3u8后缀视频Demo
  3. NoClassDefFoundError解决方案
  4. 计算物理需要的计算机知识,计算物理学概述.doc
  5. 【Proteus仿真】数码管+4x4键盘矩阵按键简易计算器
  6. 基因测序股贝康医疗在港交所上市;舜宇集团战略投资汽车芯片企业地平线 | 美通企业日报...
  7. RoboMaster电控学习笔记——电机控制(1-CAN)
  8. Linux常见系统错误
  9. 华为OD机试真题 Python 实现【勾股数元组】
  10. 23岁女生嫌男友年薪15万太低?网友称:我年薪100w+,跟我吧