找回密码
 立即注册

微信登录

只需一步,快速开始

QQ登录

只需一步,快速开始

查看: 67|回复: 0

[心得] aardio 继承与多态

[复制链接]
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 74 天

    连续签到: 5 天

    [LV.6]常住居民II

    39

    主题

    79

    回帖

    1030

    积分

    钻石会员

    积分
    1030
    来自: 中国贵州贵阳
    发表于 2025-6-13 13:45:45 | 显示全部楼层 |阅读模式 来自: 中国贵州贵阳
    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    本帖最后由 XWCXF 于 2025-6-13 13:59 编辑

    面向对象编程中的继承与多态
    今天开始学习面向对象编程的核心概念——继承与多态,发现这两个概念和现实生活的现象很像,学起来挺有意思的。

    一、继承

    1. 简单继承的实现

    先试着写了一个父类Animal和子类Dog的例子,发现继承真的像"遗传"一样:

    • 父类定义了动物的基本属性(名字)和行为(发声)
    • 子类Dog不用重复写这些代码,直接通过..Animal(...)继承父类的功能
    • 子类还能重写父类的方法,比如让狗发出"汪汪"声而不是通用的"发出声音"



    [AAuto] 纯文本查看 复制代码
    [mw_shl_code=aauto,true]// 定义父类Animal
    class Animal {
    ctor(name) {
    this.name = name;
    }
    speak = function() {
    return this.name + " makes a sound.";
    }
    }
    
    // Dog类继承Animal
    class Dog {
    ctor(...) {
    this = ..Animal(...); // 调用父类构造函数
    }
    // 重写speak方法
    speak = function() {
    return this.name + " barks.";
    }
    }
    
    import console;
    var myDog = Dog("Buddy");
    console.log(myDog.speak()); // 输出:Buddy barks.
    console.pause();




    2. 多层继承的理解
    又试了三层继承(Animal→Dog→Puppy),发现子类可以层层继承上层的所有功能:

    • Puppy不仅能用Animal的name属性,还能复用Dog的构造逻辑
    • 只需要在Puppy里写自己特有的逻辑(比如"小狗轻轻叫")



    [AAuto] 纯文本查看 复制代码
    import console;
    
    class Animal {
        ctor(name) { 
            this.name = name; 
            }
        speak = function() { 
            return this.name + " makes a sound."; 
        }
    }
    
    class Dog {
        ctor(...) { 
            this = ..Animal(...); 
        }
        speak = function() {
            return this.name + " barks."; 
        }
    }
    
    class Puppy {
        ctor(...) { 
            this = ..Dog(...); 
        }
        speak = function() {
            return this.name + " puppy barks softly."; 
        }
    }
    
    var myPuppy = Puppy("Tommy");
    console.log(myPuppy.speak());  // 输出:Tommy puppy barks softly.
    console.pause();




    二、多态
    1. 多态的实际应用
    写一个猫狗的例子理解多态,发现它的核心是"同一个方法名,不同对象有不同表现":

    • Dog和Cat都继承Animal,但各自的speak方法不一样
    • 定义一个通用函数makeSound,不管传入的是狗还是猫,都能正确调用对应的发声方法


    [AAuto] 纯文本查看 复制代码
    class Animal {
        ctor(name) { 
            this.name = name; 
            }
        speak = function() {
            return this.name + " makes a sound."; 
        }
    }
    
    class Dog {
        ctor(...) { 
            this = ..Animal(...); 
        }
        speak = function() { 
            return this.name + " barks."; 
        }
    }
    
    class Cat {
        ctor(...) { 
            this = ..Animal(...); 
        }
        speak = function() { 
            return this.name + " meows."; 
        }
    }
    
    function makeSound(animal) {
        console.log(animal.speak());
    }
    
    import console;
    var myDog = Dog("Buddy");
    var myCat = Cat("Whiskers");
    makeSound(myDog);  // 输出:Buddy barks.
    makeSound(myCat);  // 输出:Whiskers meows.
    console.pause();




    2. 数组中的多态实践
    把不同动物对象放到数组里统一处理,更能体现多态的便利:

    • 不需要区分数组里的对象是狗还是猫
    • 直接循环调用speak方法,多态会自动根据对象类型执行对应的逻辑


    [AAuto] 纯文本查看 复制代码
    class Animal {
        ctor(name) { 
            this.name = name; 
        }
        speak = function() { 
            return this.name + " makes a sound."; 
        }
    }
    
    class Dog {
        ctor(...) { 
            this = ..Animal(...); 
        }
        speak = function() { 
            return this.name + " barks."; 
        }
    }
    
    class Cat {
        ctor(...) { 
            this = ..Animal(...); 
        }
        speak = function() { 
            return this.name + " meows."; 
        }
    }
    
    import console;
    var animals = {Dog("Buddy"), Cat("Whiskers")};
    for(k, animal in animals) {
        console.log(animal.speak());
    }
    // 输出:
    // Buddy barks.
    // Whiskers meows.
    console.pause();




    三、挑战:用继承和多态计算图形面积

    1. 要求

    • 定义Shape父类,包含计算面积的area方法
    • 定义Circle和Rectangle子类,重写area方法
    • 用数组存储不同图形对象,遍历输出面积


    2. 代码实现

    [AAuto] 纯文本查看 复制代码
    import math;
    import console;
    
    class Shape {
        area = function() { return 0; }  // 父类默认返回0
    }
    
    class Circle {
        ctor(radius, ...) {
            this = ..Shape(...);
            this.radius = radius;
        }
        area = function() {
            return ..math.pi * this.radius * this.radius;
        }
    }
    
    class Rectangle {
        ctor(width, height, ...) {
            this = ..Shape(...);
            this.width = width;
            this.height = height;
        }
        area = function() {
            return this.width * this.height;
        }
    }
    
    var shapes = {Circle(5), Rectangle(4, 6)};
    for(k, shape in shapes) {
        console.log("面积: " + shape.area());
    }
    // 输出:
    // 面积: 78.539816339745
    // 面积: 24
    console.pause();




    四、总结
    • 继承的核心:子类复用父类的属性和方法,通过..父类名(...)实现构造继承,避免重复代码。
    • 多态的核心:相同方法名在不同对象上有不同实现,依赖方法重写,让代码能"灵活应变"。
    • 两者的结合:继承解决代码复用,多态解决功能扩展,一起用能让程序结构更清晰、更好维护。



    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    回复

    使用道具 举报

    *滑块验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|非业余 - aardio 编程语言 - 非官方问答社区 知道创宇云防御

    GMT+8, 2025-6-27 19:42 , Processed in 0.135046 second(s), 30 queries .

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表