使用PHP v5.3中的后期静态绑定,可以static在接口中有用地声明方法; 对于PHP v5.4中的特征,方法可以是static或abstract但不是两者.这似乎是不合逻辑和不一致的.
特别地,假设一个具有特征提供所有实现的接口,静态方法除外; 除非在特征中声明了该方法,否则静态分析器会对特征内的任何引用进行跟踪.但是,在特征中提供具体实现不再强制实现/使用类来提供自己的实现 - 这是危险的; abstract static会是理想的,但不允许.
这个矛盾的解释是什么?你会如何建议解决这个问题?
interface MyInterface
{
public static function getSetting();
public function doSomethingWithSetting();
}
trait MyTrait
{
public abstract static function getSetting(); // I want this...
public function doSomethingWithSetting() {
$setting = static::getSetting(); // ...so that I can do this
/* ... */
}
}
class MyClass implements MyInterface
{
use MyTrait;
public static function getSetting() { return /* ... */ }
}
Run Code Online (Sandbox Code Playgroud) 我有一个在基类中定义的静态方法,我想在其子类中重写此方法,是否可能?
我尝试了这个,但它没有像我预期的那样工作.当我创建类B的实例并调用其callMe()方法时,将调用类A中的静态foo()方法.
public abstract class A {
public static void foo() {
System.out.println("I am base class");
}
public void callMe() {
foo();
}
}
Public class B {
public static void foo() {
System.out.println("I am child class");
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个抽象类,我希望所有子类根据实现定义一个常量 - 它主要是关于类实现的元数据.
在超类中:
protected static final String OBJECT_NAME;
protected static final String OBJECT_DEF;
Run Code Online (Sandbox Code Playgroud)
然后在子类中:
protected static final String OBJECT_NAME = "awesome class";
protected static final String OBJECT_DEF = "an awesome class that is also great";
Run Code Online (Sandbox Code Playgroud)
有没有办法强制类的实现声明一个常量?
我已经阅读了这篇相关文章,但没有太多具体的答案(或多或少的语言设计不好): 为什么静态方法不能在Java中抽象化
我有点像Scala的新人,这可能吗(可能有特征或什么)?
我尝试让我的基类扩展一个特征,但是当我真的希望它们需要在伴随对象中实现时,需要子类来实现抽象静态方法作为成员方法.
我在实现接口的类中创建了一个类方法,但我似乎无法在接口内部定义它.
IMyClass = interface
procedure someproc();
class function myfunc() : TMyClass; // compiler doesn't like this!
end;
TMyClass = class( TInterfacedObject, IMyClass )
public
procedure someproc();
class function myfunc() : TMyClass;
end;
Run Code Online (Sandbox Code Playgroud)
我想myfunc()创建并返回一个实例TMyClass.例如:
somefunc( TMyClass.myfunc(), ... );
Run Code Online (Sandbox Code Playgroud)
创建一个实例TMyClass并将其传递给somefunc.
我可以function myfunc() : TMyClass;在IMyClass接口中定义,但如果我放在class它前面,编译器会给我一个错误.如果我把它关闭,它会给我几个其他错误"E2291缺少接口方法xyz.myfunc的实现"它只是不接受接口中的相同签名和类中的相同.
我以为我之前看过这个工作(接口中定义的类方法)但可能没有.
如果不直接支持,你怎么做?
(我正在使用Delphi XE5,以防万一.)
我从名为 UserViewHolder 的官方示例中学习了 ViewHolder 的使用。
public class UserViewHolder extends RecyclerView.ViewHolder {
static UserViewHolder create(LayoutInflater inflater, ViewGroup parent) {
UserItemBinding binding = UserItemBinding
.inflate(inflater, parent, false);
return new UserViewHolder(binding);
}
private UserItemBinding mBinding;
private UserViewHolder(UserItemBinding binding) {
super(binding.getRoot());
mBinding = binding;
}
public void bindTo(User user) {
mBinding.setUser(user);
mBinding.executePendingBindings();
}
}
Run Code Online (Sandbox Code Playgroud)
我要写很多ViewHolder类,所以我希望我能写一个抽象类。在 Java 中,它看起来像:
public abstract static class BaseViewHolder {
abstract static BaseViewHolder create()
abstract void bindTo()
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 Kotlin 编写它,但最后我发现它不像在 Java 中那么简单。
abstract class BaseViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) {
abstract …Run Code Online (Sandbox Code Playgroud) 为什么Java不支持静态方法的动态多态?如果答案是"静态方法不应该在实例上调用,因此不需要在运行时解析方法调用",那么进一步的问题是"为什么Java允许我在实例上调用静态方法?".为什么不直接通过给出一些编译时错误来阻止用户直接调用实例上的方法.
反过来说,如果Java支持静态方法的Runtime Polymorphism会出什么问题?
我想要拥有所有具有相同方法的类系列。由于这个方法非常简单,我想将其设为最终静态,例如
class A {
public static final String createSth () { }
}
Run Code Online (Sandbox Code Playgroud)
(事实上这个方法只返回String)。
有时,使用相同的方法对所有这些 A、B、C 类进行上转型会很有用。因此我想创建母亲班。
class abstract Mother {
public static abstract String createSth () { }
}
Run Code Online (Sandbox Code Playgroud)
然后为我的所有 A、B、C 类添加适当的扩展。A类扩展了Mother。
不幸的是,Java 不允许这样做。我想知道为什么?
当然,我可以删除 static Final 修饰符,然后一切正常。但另一方面,如果每个子类都返回不可以任何方式修改的常量 String,为什么不呢?
你可能会问这样的建设目的是什么?
只是我想创建数据库 sql 字符串。对于每个表,我创建了一个单独的类,并且作为 createSth 方法的结果,我想返回为此类创建表的 sql。
接口也没有帮助。
唯一的解决方案似乎是从 Mother 类的 createSth 方法中删除抽象修饰符。但是我不允许对 Mother 类进行上转型并为子类调用 createSth 方法。所以我必须删除子类的 static 修饰符。
总结为什么抽象方法不允许是静态的?好吧,我什至可以理解这一点,但是为什么不允许在子类中用静态方法替换非静态抽象方法呢?
我正在编写一个通用的编码器/解码器,并遇到了扩展通用的问题.我的想法是,我希望有一个抽象的Encodeable类,它具有一个"虚拟"静态方法解码,它接受一个Byte []并构造该对象,类似于Serializable.(我知道这不能在java中完成.)每个扩展Encodeable的类都会覆盖编码/解码方法.然后我想一般使用这些Encodeable的子类.这是试图表明我的意思:
public class Encodeable{
// I'd like to write
// static abstract Encodeable decode(Byte[]);
// similar to
// virtual Encodeable decode(Byte[]) = 0;
// in C++, but that seems to be illegal in java
static Encodeable decode(Byte[] buf){return null};
}
public class EncodeableFoo extends Encodeable{
static EncodeableFoo decode(Byte[] buf){
// do actual decoding logic here
}
}
public class Bar<T extends Encodeable>{
public void messageReceived(MessageEvent e){
Byte[] buf = e.getMessage();
T messageObj = T.decode(buf);
// do something with T …Run Code Online (Sandbox Code Playgroud)