class - Smalltalk 中的 self 和 super

标签 class inheritance smalltalk

我正在用 Smalltalk 编写我的第一个程序。我有一个实现方法的父类(super class),然后是一个从该类继承并覆盖父类(super class)方法的子类。我认为 self 语句有困难,因为当子类调用该方法时,会调用父类(super class)和子类的平衡,因此存在累积效应,而不是两者兼而有之-或选择。

这是有问题的代码的摘录:

Object subclass: Account [

        | balance |

        ...

        getBalance [    
            ^balance
        ]

        calculateInterest [
            balance:= (self getBalance)*0.2 + self getBalance.
        ]
    ]

Account subclass: PersonalAccount [

    ... 

    calculateInterest [ 
        super calculateInterest.
        balance := (self getBalance)*0.25 + self getBalance.
    ]
]

我该如何解决这个问题?

最佳答案

看起来您根本不必调用 super calculateInterest
但是为了更好的设计,请考虑以下实现:

Object subclass: Account [

        | balance |

        ...

        getBalance [    
            ^balance
        ]

        getInterest [
            ^ 0.2
        ]


        calculateInterest [
            balance:= self getBalance * self getInterest + self getBalance.
        ]
    ]

Account subclass: PersonalAccount [

    ... 

    getInterest [
            ^ 0.25
   ]
]

或者您可以将兴趣作为参数,或者您可以将兴趣作为层次结构根上的子类责任,然后每个子类都应该重新定义它。

基本上你说的是:
  • 在账户中根据利息重新计算余额是“xyz”
  • 在 PersonalAccount 中,根据利息重新计算余额是:
  • 优先,基于父类(super class)
  • 重新计算
  • "xyz"(稍作修改)

  • 不要认为你必须覆盖一个方法并调用 super 想想你在描述什么。

    关于class - Smalltalk 中的 self 和 super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32801055/

    相关文章:

    python - 在类和实例上表现不同的函数

    c# - 使用基类作为 IEnumerable<T> 的泛型

    c++ - c++中没有虚函数的多重继承

    smalltalk - 如何在 Pharo 中的 CompiledMethods 集合上打开浏览器

    c++ - 默认模板参数?

    java - 类<?实现 X> : How can I define a variable that is an instance of this

    c# - 组合优于继承 - 武器系统

    oop - 从字符串动态创建选择器

    smalltalk - SortedCollection 忽略字符串中的大小写

    php - 在 PHP 中调用不同的命名空间或类