组合与继承之重写方法和字段

接上篇blog,scala里的字段和方法属于相同的命名空间,这让字段可以重写无参数方法。例如,你可以通过改变ArrayElement类中contents的实现将其从一个方法变为一个字段,而无需修改类Element中contents的的抽象方法定义,如例:

abstract class Elements {
    def contents: Array[String]
    val height = contents.length
    val width = if(height == 0) 0 else contents(0).length
}
class ArrayElement(conts: Array[String]) extends Elements {
    //不加lazy就报错,现在还不明白为什么,先记录下
    lazy val contents: Array[String] = conts
}

object ArrayElement {
    def main(args: Array[String]): Unit = {
        val array = new ArrayElement(Array("dddaaa", "dddww"))
        println(array.width)
    }
}

这个版本的ArrayElement中的contents字段(用val定义)为Element类中的无参数方法contents(用def定义)提供了非常好的实现(在scala2.10.7版本中,为什么前面一定要加lazy才不会报错呢?不加会报空指针异常!!!)。

另一方法,scala里禁止在同一个类里用同样的名称定义字段和方法。尽管Java允许这样做。示例,这在scala类将不能通过编译:

class T2 {
    private var f = 0
    def f = 1    //不能编译通过,因为字段和方法重名
}
时间: 2024-08-02 18:44:49

组合与继承之重写方法和字段的相关文章

在继承中重写方法时抛出异常的问题

要清楚的知道子类重写父类的方法时,当父类抛出异常时,子类抛出的异常需要怎么写,首先必须了解异常的类型. Exception 这种异常分两大类运行时异常和非运行时异常(编译异常). 运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常).IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理.这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类

继承、重写方法-电子宠物系统

1 package com.szxs.pet; 2 /** 3 * 父类 :宠物类 4 * @author 5 * 6 */ 7 public class Pet { 8 private String name; // 宠物名字 9 private int health; // 宠物健康值 10 private int love; // 宠物亲密度 11 12 public String getName() { 13 return name; 14 } 15 16 public void set

1//继承和重写方法。。。。

1 package com.mingrisoft; 2 public class Employee { 3 4 5 private String name; 6 private double gongzi; 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 16 public double getGongzi

java 中继承,组合,重载,重写的实现原理 (转)

我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似的效果,就是提高代码的复用. 组合很简单也很直观,就是在一个类中直接引用另一个类,然后调用引用类的一些方法来完成一些功能,适合领域模型中has-a关系的实现:而继承则适合领域模型中is-a关系的实现. 其实在Java内部,是通过隐式的组合来实现继承的. 子类对象中会保存一个实例对象的引用super,

注册自动加载方法,序列化以及继承和重写

一.注册自动加载方法以及序列化的实现 class Common{ public function autoload($class_name){ if(file_exists('./'.$class_name.'.class.php')){ include('./'.$class_name.'.class.php'); }else{ echo 'error'; } } public static function autoload1($class_name){ if(file_exists('./

PHP对象4: final 不允许重写方法或不允许继承类

final用在方法中,能继承方法, 不允许重写方法 final用在类声名中, 此类就不能继承 <?php class A{ final function say(){ say 'Ok<br />'; } } class extends A{ } final calss C{ }

odoo9 继承父类的方法和重写父类的方法

在odoo9 中的,要继承父类的方法或重写fulide方法,得先继承基础模块,之后直接继承装饰器就可以了.其中,基础模块是用"Home"代替的. from openerp.addons.web.controllers import main as webmain from openerp.addons.web.controllers.main import Home import re class odoo9login(Home, http.Controller):     @http

创建线程时如果既传入了runnable对象,又继承thread重写了run方法,会执行的哪里的代码

1 使用线程的方式,继承thread类,重写run方法 new Thread() { @Override public void run() { System.out.println("我是新的线程"); } }.start(); 重写之后,线程执行的就是我们自己的run方法,而在Thread类中的run方法就不会被执行 这是Thread类的run方法 在这个方法中判断target是否为null,不为null,才执行target的run方法 2  既传入了runnable对象,又继承t

组合查询——继承与多态的小练习

上次个人版机房收费做的时候,组合查询这里做的不好,没有抽出模板,导致感觉有很多冗余,这次自己挑U层,一方面是感觉自己的B层和D层做的可以提升的空间目前很小了,另一方面就是想加强一下自己对细节的注意问题. 上次组合查询是这样的,以代码为例: U层代码如下: Imports System.Collections '引入HashTable类 Public Class frmColWorkInfo Dim HtZD As New Hashtable '定义处理字段名转换的hashtable Dim Ht