Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Scala中实现抽象类_Java_Scala_Oop_Abstract Class - Fatal编程技术网

Java 在Scala中实现抽象类

Java 在Scala中实现抽象类,java,scala,oop,abstract-class,Java,Scala,Oop,Abstract Class,我开始学习Scala编程和OOP编程。 我不理解抽象类的概念。我读过这个例子: 考虑为具有两个操作的整数集编写一个类的任务,包括incl和contains。(s incl x)应返回一个新集合,该集合包含元素x和集合s的所有元素。(s包含x)如果集合s包含元素x,则应返回true,否则应返回false。这些集合的接口如下所示: 比如说,我们计划将集合实现为二叉树。树有两种可能的形式。空集合的树,以及由一个整数和两个子树组成的树。下面是它们的实现 类EmptySet扩展了IntSet{ def c

我开始学习Scala编程和OOP编程。 我不理解抽象类的概念。我读过这个例子:

考虑为具有两个操作的整数集编写一个类的任务,包括incl和contains。(s incl x)应返回一个新集合,该集合包含元素x和集合s的所有元素。(s包含x)如果集合s包含元素x,则应返回true,否则应返回false。这些集合的接口如下所示:

比如说,我们计划将集合实现为二叉树。树有两种可能的形式。空集合的树,以及由一个整数和两个子树组成的树。下面是它们的实现

类EmptySet扩展了IntSet{
def contains(x:Int):布尔值=false
def incl(x:Int):IntSet=new NonEmptySet(x,new-EmptySet,new-EmptySet)
}
类NonEmptySet(elem:Int,left:IntSet,right:IntSet)扩展了IntSet{
def包含(x:Int):布尔值=
如果(xelem)right包含x else true
def incl(x:Int):IntSet=
如果(x<元素)新的非空集(元素,左包括x,右)
else if(x>元素)新非空集(元素,左,右,包括x)
除此之外
}
EmptySet和非EmptySet都扩展了类IntSet。这意味着类型EmptySet和非EmptySet符合类型IntSet–如果需要类型IntSet的值,则可以使用类型EmptySet或非EmptySet的值

我不清楚为什么引入匿名类有用,因为在扩展匿名类的两个类中,又有incl和contains的定义


谢谢

该类不是匿名的,它只是抽象的。简单地说,这意味着你不能实例化它。但是,您可以在方法签名中使用它。。。您永远不会知道哪个实现被传递给了您的方法,但它们都提供了相同的接口来与它们交互(因为它们都是
IntSet
s)


如果有帮助的话,您可以将抽象类看作是方法实现的接口,或者是特性的简单形式。

使用
InClass
(它是一个抽象类,而不是匿名类)的主要优点它定义了一种元素类型,其实例必须始终实现
incl
contains
,从而允许您在管理set对象时抽象实现细节

一个很好的例子是,您可以将集合
Empty
NomEmpty
的列表放在一起,并使用抽象类给出的契约模糊地使用它们:

val l = List[IntSet](new EmptySet, new NomEmptySet(1, new EmptySet, new EmptySet)
val setsContainingThree = l.filter(_.contains(3))
您的代码利用了这一点,请注意,我编写了
new-NomEmptySet(1,new-EmptySet,new-EmptySet)
,但它也可以是:

new NomEmptySet(1, new EmptySet, new NomEmptySet(2, new EmptySet, new EmptySet))
您的
NonEmptySet
构造函数需要
InSet
,因此您的实际参数可以是
InSet
的子类型,即:
EmptySet
NonEmptySet


这不是Scala或Java特性,而是OOP的基本原理。

我无法理解在incl方法中递归是如何工作的。请帮忙
val l = List[IntSet](new EmptySet, new NomEmptySet(1, new EmptySet, new EmptySet)
val setsContainingThree = l.filter(_.contains(3))
new NomEmptySet(1, new EmptySet, new NomEmptySet(2, new EmptySet, new EmptySet))