比如,我有一个带有SomeType的Class对象的引用,它有一个静态方法.有没有办法调用该方法无需首先实例化SomeType?最好不要逃避强打字.
编辑:好的,我搞砸了.
interface Int{
void someMethod();
}
class ImplOne implements Int{
public void someMethod() {
// do something
}
}
Class<? extends Int> getInt(){
return ImplOne.class;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,someMethod()无论如何都不能是静态的.
我熟悉静态工厂方法的想法和好处,如Joshua Bloch的Effective Java中所述:
现在,我正在尝试为正在学习Java和OO原则的人解释静态工厂方法.她从具体场景而不是抽象中学习得最好.如果她能看到工作模式,解决一些问题,她就会明白.但她发现更难以阅读上述特征的抽象列表来理解如何应用模式.
你能帮我提出一个使用静态工厂方法的现实例子,它可以使它的好处变得清晰,但是它仍然足够简单,可以在介绍性的Java类中显示某些人吗?
这个人确实有PL/SQL的编程经验,但从来没有学过OOP模式.
这个代码吼叫给我这个错误:Class 'MyNamespace\Database' not found.如何从内部引用属于无名称空间的类?
Class Database
{
public function request()
{
}
}
namespace MyNamespace
{
class MyClass
{
public function myFuction()
{
Database::request();
}
}
}
Run Code Online (Sandbox Code Playgroud) 假设以下类定义:
class A:
def f(self):
return 'this is f'
@staticmethod
def g():
return 'this is g'
a = A()
Run Code Online (Sandbox Code Playgroud)
所以f是常规方法,g是静态方法.
现在,我如何检查ffion对象af和ag是否是静态的?Python中有"isstatic"功能吗?
我必须知道这一点,因为我有包含许多不同函数(方法)对象的列表,并且要调用它们我必须知道它们是否期望"自我"作为参数.
我需要调用类的静态方法,但我只有一个类名,而不是它的一个实例.我是这样做的.
$class = new "ModelName";
$items = $class::model()->findAll();
Run Code Online (Sandbox Code Playgroud)
它可以在我的计算机上运行,但是当我移动到服务器时,它会抛出一个unexpected T_PAAMAYIM_NEKUDOTAYIM,所以我认为它实际上期望模型是变量而不是方法.
PS:如果它有帮助,它是Yii框架,所以如果有另一种方法来调用find()函数,那对我来说没问题.
提前致谢
它表示非静态变量不能用于静态方法.但是public static void main.如何?
何时以及如何在python中使用静态方法?我们已经建立了使用类方法作为工厂方法来创建对象的实例应该尽可能避免.换句话说,使用类方法作为替代构造函数并不是最佳实践(请参阅python对象的Factory方法 - 最佳实践).
假设我有一个用于表示数据库中某些实体数据的类.想象一下,数据是一个dict包含字段名称和字段值的对象,其中一个字段是使数据唯一的ID号.
class Entity(object):
def __init__(self, data, db_connection):
self._data = data
self._db_connection
Run Code Online (Sandbox Code Playgroud)
这里我的__init__方法采用实体数据dict对象.假设我只有一个ID号,我想创建一个Entity实例.首先,我需要找到其余的数据,然后创建我的Entity对象的实例.从我之前的问题中,我们确定应尽可能避免使用类方法作为工厂方法.
class Entity(object):
@classmethod
def from_id(cls, id_number, db_connection):
filters = [['id', 'is', id_number]]
data = db_connection.find(filters)
return cls(data, db_connection)
def __init__(self, data, db_connection):
self._data = data
self._db_connection
# Create entity
entity = Entity.from_id(id_number, db_connection)
Run Code Online (Sandbox Code Playgroud)
上面是一个例子,说明如果有替代方案,不做或至少不做什么.现在我想知道是否编辑我的类方法,以便它更像是一个实用工具方法,而更少的工厂方法是一个有效的解决方案.换句话说,以下示例是否符合使用静态方法的最佳实践.
class Entity(object):
@staticmethod
def data_from_id(id_number, db_connection):
filters = [['id', 'is', id_number]]
data = db_connection.find(filters)
return data
# Create entity …Run Code Online (Sandbox Code Playgroud) 关于为什么没有抽象的静态方法/字段,已经有几个SO问题,但我想知道如何实现以下伪代码:
class Animal {
abstract static int getNumberOfLegs(); // not possible
}
class Chicken inherits Animal {
static int getNumberOfLegs() { return 2; }
class Dog inherits Animal {
static int getNumberOfLegs() { return 4; }
Run Code Online (Sandbox Code Playgroud)
这是问题:假设我想确保每个继承的类Animal都包含getNumberOfLegs()方法(即几乎像一个接口,除了我确实希望抽象类实现所有子类共有的几个方法,因此纯接口不会在这里工作).getNumberOfLegs()显然应该是一个静态的方法(假设在一个完美的世界中,我们不会使鸡和狗瘫痪,因此getNumberOfLegs不依赖于实例).
如果没有"抽象静态"方法/字段,可以将方法从Animal类中删除,然后存在某些子类没有该方法的风险.或者可以制作getNumberOfLegs一个实例方法,但是必须实例化一个类以找出动物有多少腿 - 即使它没有必要.
人们通常如何实施这种情况?
编辑:我在这里如何使用它.假设(现在这很荒谬,但无论如何......)每只动物的腿数是独一无二的,所以我可能有类似的东西:
Animal getModelAnimal(int numberOfLegs) {
if (numberOfLegs == Chicken.getNumberOfLegs()) return new Chicken();
else if (numberOfLegs == Dog.getNumberOfLegs()) return new Dog();
}
Run Code Online (Sandbox Code Playgroud) 我是Go的新手,我想知道如何在Java中实现类似于抽象类和方法的结构.在Java中,我会做以下事情:
abstract class A{
static method1(){
...
method2();
...
}
abstract method2();
}
class B extends A{
method2(){
...
}
}
class C extends A{
method2(){
...
}
}
Run Code Online (Sandbox Code Playgroud)
我知道接口和结构.我可以构建一个接口,然后构建一个struct来实现method1.但是方法2怎么样?我知道我可以在另一个接口中嵌入一个接口,并将结构作为另一个结构的字段嵌入.但我没有看到用这些方法实现我的结构的方法.
我看到的唯一解决方案是在B类和C类中实现method1.还有其他方法吗?
注意:当然,在我的情况下,它不仅仅是一种方法.此外,我有一个抽象类的层次结构,并不真的想把所有内容都移到'子类'.
我在互联网上找到的例子主要是每个界面只有一种方法.如果你们其中一个人能给我一个提示,那就太棒了!谢谢.
static-methods ×10
java ×4
php ×3
oop ×2
python ×2
abstract ×1
class ×1
coding-style ×1
factory ×1
go ×1
interface ×1
namespaces ×1
unit-testing ×1
variables ×1
void ×1
yii ×1