【问题标题】:Extending abstract class in Android: A LocationProvider在 Android 中扩展抽象类:一个 LocationProvider
【发布时间】:2012-09-09 06:29:12
【问题描述】:

这可能是一个简单/愚蠢的问题。我找不到任何关于它的文档。 我想在 Android 中创建自己的 LocationProviderLocationProvider 是一个抽象类,没有构造函数。

import android.location.LocationProvider;

public class provider extends LocationProvider {
    public provider() {
    }

    @Override
    public int getAccuracy() {
        // TODO Auto-generated method stub
        return 0;
    }

...

    @Override
    public boolean supportsSpeed() {
        // TODO Auto-generated method stub
        return false;
    }
}

Eclipse 在这里给了我错误: “隐式超级构造函数 LocationProvider() 不可见。必须显式调用另一个构造函数

当然,空的超级构造函数是不可见的——LocationProvider 有 no 构造函数。我应该如何创建没有构造函数的抽象类的子类?

例如,这会引发相同的错误:

public abstract class topabstractclass {
    private topabstractclass() {
    }
}

class mysubclass extends topabstractclass{
    mysubclass() {      
    }
}

我不能修改 Android 的 LocationProvider,所以我不能创建一个公开的构造函数。 这只是一个本质上不可子分类的类吗? android 只是不希望我们创建 LocationProviders 吗?其他 LocationProviders 是如何完成的?谁能举个例子?

【问题讨论】:

    标签: java android class location-provider


    【解决方案1】:

    你的假设是正确的。 不可能扩展所有构造函数都是私有的抽象类。正确地,这意味着 Google 不希望您扩展 LocationProvider

    首先,请注意其他项目可能会clone LocationProvider。然后他们创建自己的subclasses of it,并可以在他们认为合适的时候使用它们。

    现在,我猜你想知道为什么LocationProvider 会受到这种限制。文档对此进行了解释:

    每个提供者都有一套可以使用它的标准;例如,一些供应商需要 GPS 硬件和对许多卫星的可见性;其他人则需要使用蜂窝无线电,或访问特定运营商的网络或互联网。它们还可能具有不同的电池消耗特性或用户的货币成本。 Criteria 类允许根据用户指定的条件选择提供程序。

    在这里,我们必须在字里行间稍微阅读一下。考虑有多少信息直接来自运营商并且是特定于电话的。这意味着在您的应用程序中对其进行篡改可能会阻止设备运行,因为其提供者不再遵循其深奥的规则。这就是为什么 Android sets up all the providers for us(这个链接真的很方便,它会告诉你如何在没有你自己的提供者的情况下访问该位置信息。)

    所以,不,你不能隐式*扩展LocationProvider。您必须使用已经存在的一种,因为它们是专门为在载体、硬件和软件之间工作而设计的。

    *如@Funtik 的回答所示,您可以使用String, ILocationManager 签名扩展LocationProvider。但是,它没有文档,标有{@hide},并且在以前的版本中不受支持,因此您可能需要花一些时间来获得正确的构造方法。

    【讨论】:

      【解决方案2】:

      你说的是android.location.LocationProvider吗?

      根据 grepcode.com 它有一个公共构造函数public LocationProvider(String name, ILocationManager service) 你可以试试。

      【讨论】:

      • 好地方。但是,我会指出这没有记录(并且构造函数不存在in previous versions),因此依赖它可能是危险的。
      • @Eric,正如 Thomas 所说,它是在 2.2.2 中引入的。我自己,我不会弄乱它的子类化,因为它最终会很混乱
      【解决方案3】:

      你是对的,你不能从一个构造函数都是私有的类继承。通常我希望它们只是 package-private,这样同一个包中的其他类,可能是由它的实现者编写的,仍然可以从它继承。

      但是,在 Android 4.1.1 上,LocationProvider 确实 有一个 public constructor。它的签名建议你应该实现ILocationManager

      回顾版本,这个构造函数是在 2.3 中添加的。版本 2.2.2 has one 只需要一个 String。该构造函数一直追溯到 1.6。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多