From 1e1dad11c58fa5271aaaf326546e3a5e5c7f60e6 Mon Sep 17 00:00:00 2001 From: wangjiashuo <1443062665@qq.com> Date: Sat, 30 May 2026 13:17:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20w4=20=E5=9B=BE=E5=BD=A2?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E7=B1=BB=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w4/Circle.class | Bin 0 -> 323 bytes w4/Circle.java | 12 ++++++++++++ w4/Rectangle.class | Bin 0 -> 332 bytes w4/Rectangle.java | 14 ++++++++++++++ w4/Shape.class | Bin 0 -> 208 bytes w4/Shape.java | 3 +++ w4/ShapeUtil.class | Bin 0 -> 1173 bytes w4/ShapeUtil.java | 15 +++++++++++++++ w4/Triangle.class | Bin 0 -> 342 bytes w4/Triangle.java | 14 ++++++++++++++ w4/实验报告.txt | 13 +++++++++++++ w4/类图.txt | 22 ++++++++++++++++++++++ 12 files changed, 93 insertions(+) create mode 100644 w4/Circle.class create mode 100644 w4/Circle.java create mode 100644 w4/Rectangle.class create mode 100644 w4/Rectangle.java create mode 100644 w4/Shape.class create mode 100644 w4/Shape.java create mode 100644 w4/ShapeUtil.class create mode 100644 w4/ShapeUtil.java create mode 100644 w4/Triangle.class create mode 100644 w4/Triangle.java create mode 100644 w4/实验报告.txt create mode 100644 w4/类图.txt diff --git a/w4/Circle.class b/w4/Circle.class new file mode 100644 index 0000000000000000000000000000000000000000..d5e249307257d56f394e35160634b26501db5ea8 GIT binary patch literal 323 zcmX|5%T5A85Uk$UxXWgVfXbDN!Y0ZO7$RZyq+TH02bjPpE@s^Iw~UE|#DgE;FPRv7 zR%0fq?w+oyuFvoH4*-{FM{wW@crkng1b@7ekBShS>s%KDg4^v)L+l|Gh+@s;NI4>M&Z za%P>xQWZm^WOXkiMB`0q=ITn@W$pLgnRQ2pvp5``7h4);Fx85=yMaQOjIx&x&r vTZq?+-DFIvjR%kUAp%ykaPX%)=3la$7V7C6#C-)X|60ptSH?rG4vu~Ro&Pal literal 0 HcmV?d00001 diff --git a/w4/Circle.java b/w4/Circle.java new file mode 100644 index 0000000..b3a64bc --- /dev/null +++ b/w4/Circle.java @@ -0,0 +1,12 @@ +public class Circle extends Shape { + private double radius; + + public Circle(double radius) { + this.radius = radius; + } + + @Override + public double getArea() { + return Math.PI * radius * radius; + } +} diff --git a/w4/Rectangle.class b/w4/Rectangle.class new file mode 100644 index 0000000000000000000000000000000000000000..4db70ea9d14e2eb0a52af636877563c792a75113 GIT binary patch literal 332 zcmX|5%Syvg6r7W%iD^>nYpolbEZn#iL5!}%g_Z7a+e>nNq!QBlSt7IuF8lyLN}L2K z7v`RGX6DTK`ThC^aE-$d7Hl6*1Q(vb9hK@;3%qkvndU-Z57TjgEd)No2-}DR!M&a~ zsw$qTbKlIYDFu?ZqBug*D!fvgqHIVH^E@33oU8ea>g3i``fl+u(e;Cxw0^(P&1J1s z7nBRa(R@))^^IxCcoTH`sFn&xjIemN#m7s!ih147Ec7ARVRr_b9gt+7knCg)KTFr> veQ+cg5C?FGF402(A2AmTcCq)r;Fye15oRlTSLi*xZ@gZ|M8tj0EFAm+g-A)rh7(GKvw_O)oq5P?!XwjAejRAj)2(%(-0b>zkyc*gGENpk1-6;ugVl>`x zB4>x^y}3=x=$ zQaJQe(T8hpk*+iNNt;lE451fPA}W>(jCjDnRF7wxtAgSUu?kKpc;U4ajLajzGrEZX23*4)e8qd{k(uoxcC}S0=j^Uhcip5H4RoKgX z)u1>264xouuK1f~i882pt6~?#tnPx(|C1VZ>qgz3u`KCGo0k`aT(^o&5HnQNqxXkL z-*$d|*!lVK(~rIV-(TOcZ~$4A#%Wf;6SsA946&0*(#45edEK1l1!>va3~w7- zPzQQybKEQ%!inW9YqL^LpG~0Q%_-vYc3CumHz`VdQlw(hScp1_1^~?6a?t`fX;oiGum5+s$ieVU`W%` zy>{)8J07&V&|$b#Ao2yu&@S5c(E;qD`-J6wD6Uj7 zkUKz(%o|a}s~B21zzCgEQQWFxY%#fq@nKpcv`)PDLm?ju{Urp^Oa5A+Av0+ dybqIf--1V&qCH638Cuhrr;|$7Q{=FS-oLZZ6L0_k literal 0 HcmV?d00001 diff --git a/w4/ShapeUtil.java b/w4/ShapeUtil.java new file mode 100644 index 0000000..51884ac --- /dev/null +++ b/w4/ShapeUtil.java @@ -0,0 +1,15 @@ +public class ShapeUtil { + public static void printArea(Shape shape) { + System.out.println("图形面积为:" + shape.getArea()); + } + + public static void main(String[] args) { + Shape circle = new Circle(5); + Shape rectangle = new Rectangle(4, 6); + Shape triangle = new Triangle(3, 8); + + printArea(circle); + printArea(rectangle); + printArea(triangle); + } +} diff --git a/w4/Triangle.class b/w4/Triangle.class new file mode 100644 index 0000000000000000000000000000000000000000..f2bcdab95cac49d6be7e9d1195ca4ff57a5605e0 GIT binary patch literal 342 zcmX|5OHRWu6ddR0CL|3i<+o%5O%~m-MIc0Ah1j&}-T^Byg%pL9Yat{mBo-WiQ*aW* zBm!({p5L2!GyeR3{{V1~-2fJB2`7XLPr#j&>Ol*5N2W5(v4A~FWhdyyV6s@&*ZRV=Wb~IezEw{OdyKMZYw_|w-HW+hWfTSs++cSIn;j6RZxHFh z3NlSrh+a4n7!n6?h%V8C4~agF1vatuYp_p7P|+V^J$;3o6QcR^|Gw9;A#s~C3p+oV CYA{Iv literal 0 HcmV?d00001 diff --git a/w4/Triangle.java b/w4/Triangle.java new file mode 100644 index 0000000..d81b1c5 --- /dev/null +++ b/w4/Triangle.java @@ -0,0 +1,14 @@ +public class Triangle extends Shape { + private double base; + private double height; + + public Triangle(double base, double height) { + this.base = base; + this.height = height; + } + + @Override + public double getArea() { + return 0.5 * base * height; + } +} diff --git a/w4/实验报告.txt b/w4/实验报告.txt new file mode 100644 index 0000000..0a7a8bf --- /dev/null +++ b/w4/实验报告.txt @@ -0,0 +1,13 @@ +“组合 vs 继承”问题解析 + +维度 继承 (Inheritance) 组合 (Composition) +定义 子类“是一种”父类(is-a 关系),复用父类代码 类中包含其他类的对象(has-a 关系),复用对象功能 +耦合度 高,子类与父类强绑定,父类修改会影响所有子类 低,仅依赖对象的接口,修改不影响调用方 +灵活性 差,继承关系在编译期确定,无法动态修改 好,可在运行时替换组合的对象,适配不同场景 +适用场景 类之间有明确的层级关系,且父类接口稳定 仅需复用功能,无需共享接口,或需要动态切换实现 +本实验中的选择 使用继承,因为 Circle/Rectangle/Triangle 本质上“是一种” Shape,且需要统一的  getArea()  接口实现多态 不适合本场景,若用组合则无法实现统一的多态处理 + + +1. AI 使用情况:使用 AI 辅助梳理了抽象类与多态的实现逻辑,快速完成了基础代码框架和类图设计,并辅助理解了组合与继承的核心区别。 +2. 核心收获:通过重构,实现了图形的统一处理,新增图形时只需继承  Shape  类,无需修改  ShapeUtil  代码,符合开闭原则。 +3. 反思:继承适合有层级关系的场景,但过度继承会导致类爆炸;组合更灵活,但需要额外的接口抽象,实际开发中应优先考虑组合,必要时结合继承。 diff --git a/w4/类图.txt b/w4/类图.txt new file mode 100644 index 0000000..9986eb6 --- /dev/null +++ b/w4/类图.txt @@ -0,0 +1,22 @@ +类图说明 + +plaintext + +┌─────────────┐ +│ Shape │ (抽象类) +├─────────────┤ +│+getArea():double│ +└──────┬──────┘ + │ + ┌─────┴─────┬──────────┐ + │ │ │ +┌────────┐┌────────────┐┌────────────┐ +│ Circle ││ Rectangle ││ Triangle │ +├────────┤├────────────┤├────────────┤ +│-radius ││-width,-height││-base,-height│ +├────────┤├────────────┤├────────────┤ +│getArea()││ getArea() ││ getArea() │ +└────────┘└────────────┘└────────────┘ +  + +- 核心关系: Shape  是抽象父类, Circle 、 Rectangle 、 Triangle  继承自  Shape ,实现  getArea()  方法; ShapeUtil  依赖  Shape  类实现统一处理。 \ No newline at end of file