1. 程式人生 > >用面向物件方法實現求圓和橢圓的周長與面積

用面向物件方法實現求圓和橢圓的周長與面積

  設最底層的基類為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([email protected] <= 0) stop("Radius is negative") }) ##定義計算面積的介面 setGeneric("area",function(obj,...) standardGeneric("area"
)) ##實現面積介面 setMethod("area","Circle",function(obj,...){ print("Area Circle Method") pi * [email protected]^2 }) ##定義周長的介面 setGeneric("circum",function(obj,...) standardGeneric("circum")) ##實現周長介面 setMethod("circum","Circle",function(obj,...){ 2 * pi *[email protected] }) ##建立兩個圓的例項---------------#
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([email protected]) != 2 ) stop("It's not Ellipse.") if (length(which([email protected]<=0))>0) stop("Radius is negative.") }) ##計算橢圓的面積 setMethod("area","Ellipse",function(obj,...){ print("Area Ellipse Method") pi * prod([email protected]) }) ##計算橢圓的周長 setMethod("circum","Ellipse",function(obj,...){ cat("Ellipse Circum: \n") 2*pi * sqrt(([email protected][1]^2 + [email protected][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([email protected],"\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([email protected])
})

##area介面的Circle實現
setMethod("area","Circle",function(obj,...){
    cat("Circle Area: \n")  
    pi*[email protected]^2
})


##circum介面的Ellipse實現
setMethod("circum","Ellipse",function(obj,...){
    cat("Ellipse Circum: \n")
    2*pi*sqrt(([email protected][1]^2 + [email protected][2]^2)/2)
})

##circum介面的Circle實現
setMethod("circum","Circle",function(obj,...){
    cat("Circle circum: \n")
    2*pi*[email protected]
})

##建立例項
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)

相關推薦

面向物件方法實現橢圓周長面積

  設最底層的基類為Shape,Shape有周長和麵積,圓Circle和橢圓Ellipse繼承於Shape,設定計算周長的介面為circum(),計算面積的介面為area()。繼承圖表如下: 圖(1) Shape、Circle和Ellipse之間的繼承圖表

面向物件方法實現簡易計算器

#計算器 面向物件寫法 import tkinter class jsq: #初始魔術方法 def __init__(self): self.a = False self.root = tkinter.Tk()

C++抽象類,派生類,正方形,矩形,梯形,三角形面積

do{cout<<"/t/t*************************************"<<endl;cout<<"/t/t             請選擇選單              "<<endl;cout<<"/t/t    

Java 面向物件方法集合的交集,差集,並集

注意事項: 在自定義類中的成員屬性是兩個集合 在求集合的交集,差集,並集時,會修改成員屬性的這兩個集合的物件。即,若是求交集,使用的是list1.retainAll(list2)方法,此時,集合1中只剩下與集合2 相同的資料,當再求差集時,就會差生錯誤 消除

兩種方法(遞歸DP)實現了青蛙跳臺階

col rac color 題目 方法 pan ret 提高 page 做了這道題目: https://www.nowcoder.net/practice/8c82a5b80378478f9484d87d1c5f12a4?tpId=13&tqId=11161&

.NET基礎之面向物件實現異常的處理基礎

轉自:http://www.cnblogs.com/edisonchou/p/4803879.html   面向物件的實現和異常的處理基礎  Index : (1)型別語法、記憶體管理和垃圾回收基礎 (2)面向物件的實現和異常的處理基礎 (3

面向物件重寫thread 實現多次呼叫一個執行緒

思路:   利用thread類中,run方法在子執行緒中呼叫,其他方法在主執行緒呼叫,所以將生產者寫入主執行緒,將消費者寫入run函式中在子執行緒中執行,完成生產者消費者模型 注意:   1.  要在 init 函式中例項化一個Queue佇列作為生產者消費者中介   2.  要在 init 函式中把d

程式實現對資料排序並按出現次數進行排序 程式實現對資料排序並按出現次數進行排序(注:面向物件的方式實現for迴圈進行排序,別comparable介面實現){1,4,2,1,3,2,1,4}作為

程式實現對資料排序並按出現次數進行排序 程式實現對資料排序並按出現次數進行排序(注:用面向物件的方式實現,用for迴圈進行排序,別用comparable介面實現){1,4,2,1,3,2,1,4}作為引數(引數可變)傳入java方法中,控制檯輸出以下結果 1出現了3次 2出現了2次

面向物件的思想實現一個有理數以及有理數的加減乘除運算——Scala版本

有理數 有理數是“數與代數”領域中的重要內容之一,在現實生活中有廣泛的應用,是繼續學習實數、代數式、方程、不等式、直角座標系、函式、統計等數學內容以及相關學科知識的基礎。數學上,有理數是一個整數a和一個正整數b的比,例如3/8,通則為a/b。0也是有理數。有理

面向物件的思想實現一個有理數以及有理數的加減乘除運算——Python版本

class Rational(object): def __init__(self,a,b=1): if(b ==0 ):#對於分母為0的情況直接舉異常 raise Except

.NET基礎拾遺(2)面向物件實現異常的處理基礎

一、面向物件的實現 1.1 C#中的類可以多繼承嗎?   在C#中申明一個型別時,只支援單繼承(即繼承一個父類),但支援實現多個介面(Java也是如此)。像C++可能會支援同時繼承自多個父類,但.NET的設計小組認為這樣的機制會帶來一些弊端,並且沒有必要。   首先,看看多繼承有啥好處?多繼承的

編寫一個Cirle類,包括構造方法面積周長,如果的半徑小於0則丟擲異常,讓使用者必須處理,半徑必須大於0才可以

public class Circle{private double radios;public Circle() {super();// TODO Auto-generated constructor stub}public Circle(double radios) {super();this.radio

Python 進階_OOP 面向物件程式設計_類屬性方法

目錄 類屬性 在理解類屬性之前要先搞清楚 例項屬性 和 函式屬性 之間的區別: 1. 例項屬性:指的是例項化類物件的屬性,需要在類中使用 self 關鍵字來將其和例項化物件繫結的屬性。 2. 函式屬性:指的是定義在函式體內的屬性,其可以是例項屬

面向物件方法結構化方法各自的特點利弊

結構化技術的特點:把現實世界描繪為資料在資訊系統中的流動,在資料流動過程中資料發生轉化。通過自頂向下的程式設計將複雜的程式分解為程式模組的層次圖。概括為自頂向下、逐步求精、模組化設計、結構化編碼的基本特點。面向物件的特點:面向物件技術將資料模型和處理模型二者合一,將屬性和方

定義一個長方形類並將周長面積定義為成員方法實現周長和麵積的動能(要求鍵盤錄入長寬)

package org.westos_05_封裝和private; /*  * 定義一個學生類,提供成員變數姓名,和年齡 *  * 現在的寫法:需要將成員變數私有化,提供對外的公共訪問方法(也屬於成員方法) * */ class Student2{//私有化成員變數priv

Java面向物件實現加減乘除

import java.util.Scanner; class MyMath{ public int add(int a,int b){ return a + b; }

約瑟夫環演算法面向物件的一種實現

首先介紹下約瑟夫環: 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 下面就來個實際

ios網絡學習------3 非代理方法實現異步post請求

erro form b2c enc 界面 關聯 error pre mut #pragma mark - 這是私有方法。盡量不要再方法中直接使用屬性,由於一般來說屬性都是和界面關聯的,我們能夠通過參數的方式來使用屬性 #pragma mark post登錄方法 -(v

實現多個具有相同方法的接口父類實現接口有相同方法

不顯示 就是 super關鍵字 向上 向上轉型 問題 super void urn 一、實現多個具有相同方法的接口 這種情況還是比較少會遇到的,但事實是存在這樣的問題,所以寫下解決的方法: 使用內部類: interface InterA { void f(); } in

Java學習——方法中傳遞參數分簡單類型復雜類型(引用類型)編程計算100+98+96+。。。+4+2+1的值,遞歸方法實現

dig oid 傳遞 system alt style 類型 遞歸 gen package hello; public class digui { public static void main(String[] args) { /