0

这可能是一个简单/愚蠢的问题。我找不到任何关于它的文档。我想在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没有构造函数。我应该如何创建没有构造函数的抽象类的子类?

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

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

class mysubclass extends topabstractclass{
    mysubclass() {      
    }
}

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

4

3 回答 3

3

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

首先,请注意其他项目可能会克隆LocationProvider. 然后他们创建它的子类,并且可以在他们认为合适的时候使用它们。

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

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

在这里,我们必须在字里行间稍微阅读一下。考虑有多少信息直接来自运营商并且是特定于电话的。这意味着在您的应用程序中对其进行篡改可能会阻止设备运行,因为其提供者不再遵循其深奥的规则。这就是 Android为我们设置所有提供程序的原因。(此链接非常方便保留。它将向您展示如何在没有您自己的提供商的情况下访问该位置信息。)

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

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

于 2012-09-09T06:43:00.707 回答
1

你在谈论android.location.LocationProvider吗?

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

于 2012-09-09T06:45:00.527 回答
1

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

但是,在 Android 4.1.1 上,它看起来LocationProvider 确实有一个public constructor。它的签名建议您应该实施ILocationManager

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

于 2012-09-09T06:50:10.463 回答