- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么不能在子类中隐藏构造函数?
我收到以下异常:
Fatal error: Access level to CIS\Logger\WPLogger::__construct() must be public (as in class Katzgrau\KLogger\Logger) in /builds/r2o/website/wp-content/mu-plugins/toolsets/lib/cis-logger/src/WPLogger.php on line 12
父类(super class)代码(来自外部库):
public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array()) { // ...
}
WPLogger.php(子类)代码:
private function __construct(string $logDirectory, string $logLevelThreshold = LogLevel::DEBUG, array $options = array()) {
parent::__construct($logDirectory, $logLevelThreshold, $options);
// ... some actions
}
}
public static function getInstance(string $logFileRelative = self::DEFAULT_LOG_NAME, string $logLevelThreshold = LogLevel::DEBUG, array $options = array()) {
// ...
}
我不想用new
实例化这个特殊的子类。出于某些原因,我希望使用 getInstance()
静态创建它。我怎样才能做到这一点?
最佳答案
您可以使用继承扩展方法的可见性。下面的例子是正确的
class A
{
private function __construct()
{}
}
class B extends A
{
public function __construct()
{}
}
但是您不能限制子类中方法的可见性。下面的例子是不正确的
class A
{
public function __construct()
{}
}
class B extends A
{
private function __construct()
{}
}
在你的例子中,你试图隐藏构造函数,因为你想创建单例。在许多情况下,单例是不好的做法。你应该使用对象构建的其他模式:Static Factory , Service Locator , Dependency Injection Container
例如,你可以通过静态工厂的简单修改来归档必要的结果:
class LoggerFactory
{
private static $instance = null;
public static function build()
{
if (is_null(static::$instance)) {
static::$instance = // making of the logger
}
return static:$instance;
}
}
关于php - 当父级公开时,如何将子构造函数设为私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53869888/
由“CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", ES_MULTILINE.."创建的文本框需要\r\n 换行。我将我的 stdoutput 重定向到那个文
我是一名优秀的程序员,十分优秀!