Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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_Design Patterns - Fatal编程技术网

java方法能否根据条件返回值?

java方法能否根据条件返回值?,java,design-patterns,Java,Design Patterns,我有一个ICoreClient接口,AClient和BClient类实现了这一点 ICoreClient为用户公开 我需要在ICoreClient界面中添加一个新方法。因此,它需要在两个客户端中实现。我无法使此方法通用,因为它具有完全不同的签名,但具有相似的功能 我有两个接口xx和yy ClientA实现xx和ClientB实现yy 因此,我决定在ICoreClient中添加一个新的testMethod,它将根据客户机为我提供xx或yy的实例 我想根据条件从单个方法返回这些接口的实例 在Clie

我有一个
ICoreClient
接口,
AClient
BClient
类实现了这一点

ICoreClient
为用户公开

我需要在
ICoreClient
界面中添加一个新方法。因此,它需要在两个客户端中实现。我无法使此方法通用,因为它具有完全不同的签名,但具有相似的功能

我有两个接口
xx
yy

ClientA
实现
xx
ClientB
实现
yy

因此,我决定在
ICoreClient
中添加一个新的
testMethod
,它将根据客户机为我提供
xx
yy
的实例

我想根据条件从单个方法返回这些接口的实例

ClientA

public xx testMethod(){
  return instanceof xx;
}
public yy testMethod(){
  return instanceof yy;
}
ClientB

public xx testMethod(){
  return instanceof xx;
}
public yy testMethod(){
  return instanceof yy;
}
我应该在
ICoreClient
界面中写什么?

public zz testMethod()
我尝试放置一个虚拟接口
zz
(充当一个通用超类型)
xx
yy
都实现了这一点。但仍然无法在各自的客户机中公开
xx
yy
的方法,因为它最终在
zz
中进行了类型化

对于这种情况,有什么已知的方法吗

编辑:如果我将返回类型设置为
对象
,则这些接口的方法不会公开。虽然,对象包含
xx
yy
的实例


用户仍然需要将其转换为(
xx
yy
用户如何知道?)才能使用界面中的方法。。我想公开
ClientX
的方法,而不必强制转换到
ClientA
ClientB

只有当
xx
yy
有一个公共的超类型(接口或类)时才有可能。在最坏的情况下,始终可以返回对象

public Object testMethod () // or a more specific common super type of `xx` and `yy`
{    
    if (..some condition..) {
        return ..instanceof `xx`..;
    } else if (..other condition..) {
        return ..instanceof `yy`..;
    }
    return null; // or some other default instnace
}

由于返回对象意味着您必须在客户端强制转换,因此您可以返回一个包含可能值的自定义对象:

public class MethodResult
{
    private xxx xResult;
    private yyy yResult;
    public MethodResult(xxx xResult){
        this.xResult=xResult;
    }
    public MethodResult(yyy Result){
        this.yResult=yResult;
    }
    public xxx getXResult(){return xResult;}
    public yyy getYResult(){return yResult;}
}
然后返回此类型:

public MethodResult testMethod () 
{
    if (..some condition..) {
            return new MethodResult(new xxx());
        } else if (..other condition..) {
            return new MethodResult(new yyy());;
        }
    }
}

然后,客户机可以检查哪个结果不是null,并相应地使用类型,根据设置的方法,可以访问xxx或yyy上定义的所有方法。或者,您可以添加一个方法,该方法允许您检查设置了哪些结果,而不是检查null…

在您的编辑之后,您可能正在查找。你可以这样做你的界面

interface ICoreClient<T>{// T will be set by each class implementing this interface
    T testMethod();
}
接口ICoreClient{//T将由实现此接口的每个类设置
T testMethod();
}
你的每一个班级看起来都像

class ClientA implements ICoreClient<xx>{
    xx testMethod(){
        //return xx
    }
}

class ClientB implements ICoreClient<yy>{
    yy testMethod(){
        //return yy
    }
}
类ClientA实现ICoreClient{
xx测试方法(){
//返回xx
}
}
类ClientB实现ICoreClient{
yy测试方法(){
//返回yy
}
}

我想返回这些接口的实例-你是说扩展了这个接口的类的实例吗?你想做的对我来说似乎很奇怪。我相信有一个比这个更好的解决方案…xx的
返回实例应该做什么?这看起来不像有效语法。相关,可能重复:接口的方法需要返回一个类型,调用方只能使用该类型中的方法(不强制转换)。因此,如果您希望调用方能够在不强制转换返回值的情况下调用返回值上的某个方法,则该方法需要在返回类型中。
+​l
用于普通超类型。基本上应该是那样或是分开的方法。。对象将包含
xx
yy
的实例。。但是用户仍然需要使用界面中的方法对其进行类型转换。。OP想要的是公开
XClient
的方法,而不必进行打字。编辑之后,问题发生了很大变化,这似乎很适合+1.