Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 Android:如何允许使用接口仅访问对象成员的一部分_Java_Android - Fatal编程技术网

Java Android:如何允许使用接口仅访问对象成员的一部分

Java Android:如何允许使用接口仅访问对象成员的一部分,java,android,Java,Android,我如何“传递一个接口”,即,在 另一个是使DownloadFileTask 把一些东西传给公众 构造器。在这种情况下,要最小化 耦合,可能是你没有 想通过一项活动,但有些 其他类型的接口限制了 异步任务可以做什么。这样, 您可以选择实现 活动上的接口,或作为 单独的对象或任何东西 Commonware 4月27日10点17分 如何允许线程仅访问某些(或仅一个)对象公共方法 答案>参见下面的答案 真正的问题是我对接口功能的误解。如果将方法F的输入类型(或类的参数化)指定为接口[即F(my_接口i)

我如何“传递一个接口”,即,在

另一个是使DownloadFileTask 把一些东西传给公众 构造器。在这种情况下,要最小化 耦合,可能是你没有 想通过一项活动,但有些 其他类型的接口限制了 异步任务可以做什么。这样, 您可以选择实现 活动上的接口,或作为 单独的对象或任何东西 Commonware 4月27日10点17分

如何允许线程仅访问某些(或仅一个)对象公共方法

答案>参见下面的答案

真正的问题是我对接口功能的误解。如果将方法F的输入类型(或类的参数化)指定为接口[即F(my_接口i)],并将对象X传递给实现my_接口[F(X)]的方法,则即使存在其他成员,方法F也只能访问实现my_接口的X成员


我认为接口只对实现类施加了约束。我不明白,当接口被用作类型时,它也会限制对实现类成员的访问。回想起来,考虑到Java是静态类型的,这是显而易见的。有关更多信息,请参阅。您可以像传递任何函数一样,向异步任务传递接口。例如:

interface MyInterface { ... }

class MyClass implements MyInterface { ... }

AsyncTask<MyInterface, Integer, Void> myAsyncTask = new ...;
myAsyncTask.execute(myClassInstance);
接口MyInterface{…}
类MyClass实现MyInterface{…}
AsyncTask myAsyncTask=新建。。。;
myAsyncTask.execute(myClassInstance);
AsyncTask是一个泛型,允许您指定参数类型、进度返回类型和结果类型(分别为MyInterface、Integer和Void)。可以指定所需的任何接口、类、枚举或基元类型


从这里开始,它只是您的标准编码。创建一个扩展接口的类,创建一个参数设置为接口的异步任务,传入该类,该任务只能访问接口函数。您需要小心线程问题(数据争用等)

假设您需要能够报告某些后台任务的步骤。您可以选择通过更改标签的文本或更改通知气泡的文本来执行此操作

一种方法是将标签或通知传递给后台任务:

public class BackgroundTask {
    private Label labelToUpdate;
    private Notification notificationToUpdate;

    public BackgroundTask(Label label) {
        this.labelToUpdate = label;
    }

    public BackgroundTask(Notification notification) {
        this.notificationToUpdate = notification;
    }

    //...
    private void reportNewStep(String step) {
        if (labelToUpdate != null) {
            labelToUpdate.setText(step);
        }
        if (notificationToUpdate != null) {
            notificationToUpdate.alert(step);
        }
    }
}
这将后台任务与UI以及报告进度的两种可能方式结合起来。如果添加第三个,则必须更改BackGroundTask的代码

现在提取一个接口:

public interface ProgressListener {
    void report(String step);
}

public class BackgroundTask {
    private ProgressListener listener;

    public BackgroundTask(ProgressListener listener) {
        this.listener = listener;
    }

    //...
    private void reportNewStep(String step) {
        listener.report(step);
    }
}
背景任务现在更简单了,不再依赖于所有可能的方式来报告进展。调用方只需给它一个ProgressListener接口的实现。对于基于标签的进度,它将执行以下操作:

BackgroundTask task = new BackgroundTask(new ProgressListener() {
    @Override
    public void report(String step) {
        label.setText(step);
    }
});
或者您的活动可以直接实现ProgressListener:

public class MyActivity implements ProgressListener {
    private Notification notification;

    // ...
    @Override
    public void report(String step) {
        notification.alert(step);
    }
    // ...
    BackgroundTask backgroundTask = new BackgroundTask(this);
}

标签和BackgroundTask之间,或者MyActivity和BackgroundTask之间不再耦合。BackgroundTask不能再调用任何Label、Notification或MyActivity方法。它只能调用它应该调用的:专用ProgressListener接口的方法。

我不清楚您的问题。可以像对象一样将接口传递给另一个类。您传递的不是接口,而是实现接口的对象。对于最后一行中的问题:UI线程必须修改UI组件。尝试发布一些代码或更好地解释您将实现的功能Francesco,我想创建一个具有两组不同接口的对象,然后在同一个程序中独立使用这些接口。这可能吗?有关上下文,请参见链接问题。