[英]Is an interface and an abstract class with just virtual abstract methods the same thing?
[英]Are there such thing as class methods in Scala?
许多oo语言为类方法和类变量提供了一定的便利。 例如Ruby允许使用元类。 在Scala中以类似的方式查看伴侣对象是否公平?
在Scala中以类似的方式查看伴侣对象是否公平?
是的,这是考虑它们的合理方法。
在JVM上,类的含义不同于在Ruby或其他动态语言中的对象。 当然,您可以将类的表示形式表示为类Class[_]
的特殊对象,但是它主要用于反射,例如,不能具有自定义方法。 但是,JVM具有与类相关联的静态方法和字段的概念,并且不需要使用该类的对象:
public class SomeClass
public static int add(int x, int y) { return x + y; }
}
public class OtherClass {
public static void main() {
int z = SomeClass.add(1, 2);
}
}
这些方法和字段本质上是“全局”的(除非我们考虑使用类加载器机制),例如,方法不能在子类中覆盖。
Scala不允许您直接定义和使用静态-语言中没有“静态”的概念。 但是,在Scala中,您可以定义可用于模拟静态字段和方法的单例对象,同时它们比静态函数强大得多,例如,它们可以参与继承。 在内部,这些对象是Scala编译器为您生成的特殊类的实例。
Scala还具有一种特殊的此类单例对象,称为伴侣对象,它们与某些类共享名称:
class SomeClass
object SomeClass
国内这些对象是完全不同的类比的情况下SomeClass
(它可以作为访问SomeClass.type
),但斯卡拉对待他们特殊的方式,例如,你可以访问SomeClass
私人会员SomeClass
同伴对象,反之亦然。 伴随对象还提供其他隐式作用域。 但是, SomeClass.type
和SomeClass
是完全不同的类。
简而言之,是的,您可以将伴随对象视为“类”方法和字段的容器,但仅在某种程度上。 伴侣对象无论如何都不是元类。 它们具有完全不同的语义和实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.