Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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/4/oop/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 如果每个子类型都有唯一的属性,那么获得单独子类型以进行协作的正确方法_Java_Oop_Inheritance_Interface_Subtyping - Fatal编程技术网

Java 如果每个子类型都有唯一的属性,那么获得单独子类型以进行协作的正确方法

Java 如果每个子类型都有唯一的属性,那么获得单独子类型以进行协作的正确方法,java,oop,inheritance,interface,subtyping,Java,Oop,Inheritance,Interface,Subtyping,我认为这更像是一个概念性的面向对象编程问题,而不是一个技术性的问题。我有一些想法可以使用,但每一个想法都更像是一个黑客解决方法,而不是易于扩展的解决方案。我试图找出或多或少被接受的解决这类问题的方法 假设我有一个接口Scalar 公共接口标量{ 公共标量加法(标量加数); ... 有两个具体实现:RealScalar表示十进制值和RationalScalar表示分数 公共类RealScalar实现标量{ 私人双重价值; 公共RealScalar(双输入) { 值=输入; } ... 公共

我认为这更像是一个概念性的面向对象编程问题,而不是一个技术性的问题。我有一些想法可以使用,但每一个想法都更像是一个黑客解决方法,而不是易于扩展的解决方案。我试图找出或多或少被接受的解决这类问题的方法

假设我有一个接口
Scalar

公共接口标量{
公共标量加法(标量加数);
...
有两个具体实现:
RealScalar
表示十进制值和
RationalScalar
表示分数

公共类RealScalar实现标量{
私人双重价值;
公共RealScalar(双输入)
{  
值=输入;
}
...
公共类RationalScalar实现标量{
私有整数分子、分母;
公共理性标量(整数分子,整数分母)
{  
这个。分子=分子;
这个。分母=分母;
}
...
我使用工厂类
ScalarFactory
实例化新的标量,作为一种使实现与当前引用的
Scalar
类型无关的方法

如果每个子类型都具有该子类型特有的属性(和方法)(在本例中,
RealScalar
value
分子
分母
用于
RationalScalar
),java编译器无法提前知道标量的运行时类型,从而导致实现的方法(在父接口中声明)例如:

@覆盖
公共RealScalar multi(标量被乘数)
{
如果(getClass()!=被乘数。getClass())
被乘数=被乘数。toReal();
返回新的RealScalar(值*(
(RealScalar)被乘数).getValue();
}
导致编译时错误,因为
toReal
是子类
RationalScalars
的一种方法:

./RealScalar.java:22: error: cannot find symbol
            multiplicand=multiplicand.toReal();
                                     ^
  symbol:   method toReal()
  location: variable multiplicand of type Scalar
让这些子类协作的正确方法是什么

编辑:我实际上是通过向接口添加一个转换函数来实现的,该接口将类类型作为参数,然后在每个子类型中实现它。虽然这样做有效,但我仍然不确定这在概念上是否正确。一方面,转换为其他类型的值的能力是您希望从对象中获得的蚂蚁是一个数学实体,另一方面,这使得子类型稍微相互依赖

可能的解决方案 1)在子类型中包含一个方法
convert
,该方法接受标量并生成子类型的标量。

问题是子类型应该是相对独立的,并且在正常情况下具有类似的属性。这需要对每个类进行显式编码以操作其他子类型的唯一属性,如果实现更多标量,则可能导致每个
Sca中所需的黑客解决方法的基础不断增加lar
实施

2)在界面中创建通用数字类型列表

这既难看又有问题,因为泛型numbertypes不支持数学运算,这意味着必须将值存储为泛型数,然后将其转换为每个操作的原语,这对于用例来说可能计算成本太高(多项式计算器)

3)将
RationalScalar
的值存储为十进制,仅转换为小数显示。


考虑到很难将十进制数保持为易于转换为分数的格式,而分数的格式不是
2345883/4232569

中的类是
public realscallar multi(标量被乘数),我肯定不想这样做
声明?为什么不使用
instanceof
操作符?编辑您的问题以使其清晰。@ArvindKumarAvinash我进行了编辑以使其更清晰。
multi
是在界面中声明的,
instanceof
,而缩短代码只会导致相同的问题:使代码适用于每种类型的
>标量
实现。如果我开始添加更多标量的实现,那么在每个
标量
实现中,必须对每个
标量
类型的转换检查进行硬编码。虽然这是一个可行的解决方案,但似乎是OOP和继承概念化所要避免的事情:相互依赖使未来扩展变得困难的子类之间的e哪个类是
public realscallar multi(标量被乘数)
声明?为什么不使用
instanceof
操作符?编辑您的问题以使其清晰。@ArvindKumarAvinash我进行了编辑以使其更清晰。
multi
是在界面中声明的,
instanceof
,而缩短代码只会导致相同的问题:使代码适用于每种类型的
>标量
实现。如果我开始添加更多标量的实现,那么在每个
标量
实现中,必须对每个
标量
类型的转换检查进行硬编码。虽然这是一个可行的解决方案,但似乎是OOP和继承概念化所要避免的事情:相互依赖在子类之间进行扩展,使将来的扩展变得困难