我有一个名为DatabaseObject的超类。这个类实现了Active Record设计模式,并且将被所有访问数据库的其他继承。
在PHP中,我可以这样写:
class DatabaseObject {
protected static $database;
...
public static function set_database($database) {
self::$database = $database;
}
public static function find_all() {
$sql = "SELECT * FROM " . static::$table_name;
return static::find_by_sql($sql);
}
protected static function instantiate($record) {
$object = new static;
foreach($record as $property => $value) {
if( property_exists($object, $property) ) {
$object->$property = $value;
}
}
return $object;
}
...
}
注意,使用关键字self::
和static::
引用类的dynamic方式。在该语言中,我们甚至可以这样做:
$object = new static;
在Python中,我们可以像这样创建一个类的示例:
@classmethod
def _instantiate(cls, record):
# Creates an instance of the subclass.
obj = cls
在TypeScript中,我们可以做类似的事情:
protected static instantiate(record: object): object {
const obj = new this();
...
return obj;
}
如何在PowerShell中达到同样的效果?
现在,我只能这样做:
static [void]SetDatabase($Database) {
[DatabaseObject]::Database = $Database
}
**我必须显式地写类名。**如果类应该被继承,它将无法工作。
你能告诉我做这件事的正确方法吗?
谢谢大家。
更新(@圣地亚哥Squarzon的贡献之后):
为了澄清并可能在未来帮助其他人,我将给予更多细节。
这个类有示例属性和方法,但为了保持清晰,我选择不显示它们。
静态方法应该能够设置静态属性和调用(传递参数)其他静态方法。
在静态方法中,将返回类型设置为自定义类型(子类的示例)可能会有问题。但总是可以返回包含子类示例的ArrayList。
2条答案
按热度按时间kwvwclae1#
PowerShell中
self
的等价物是$this
,但只能在示例方法上使用,而不能在静态方法上使用。基本上,如果你想从静态方法中 * 动态 * 反射类型成员,你能做的最好的事情就是将类型本身作为参数传递。此外,我不确定从一个只有静态成员的类继承有多大用处,但你可能有一个很好的理由。除此之外,你可能会发现C#比PowerShell更好的类支持,在C#中,你不需要引用类型本身来分配属性的值。例如:
然而,你很快就会发现你不能从静态类继承,这暗示了上面提到的。你可能需要重新考虑你想做什么。最有可能的是应该使用一个示例方法和一个示例属性。
静态类是密封的,因此不能被继承。它们不能从除Object之外的任何类或接口继承。
参见Static Classes and Static Class Members (C# Programming Guide)。
u0njafvf2#
在@圣地亚哥Squarzon的贡献之后,我能够这样写:
在Main.ps1文件中,可以像这样调用静态方法:
Admins是DatabaseObject的子类。