我有一个类:
<?PHP
abstract class dbCon
{
public function OpenConnection()
{
// Do Something;
// On error:
$this->ShowError();
}
abstract function ShowError();
}
class ErrorHandling extends dbCon
{
public function ShowError()
{
// Show error
}
}
?>
上述代码存在缺陷。我想从抽象类中调用ShowError(),但它是接口定义的地方。如何处理?
答案 0 :(得分:3)
你将继承与委托混为一谈。 ErrorHandler应该是dbCon的委托。
确定A类是否应该是B的子类的一种有用方法是问自己是否说“A是比B更具体的东西”。也就是说,A是否至少 B的所有基本属性和行为。这是真实的例子,也不是:
TRUE:美洲狮是猫的类型。
在案例2中,卡车是汽车的部分,因此建模的正确方法是通过组合;有一个Car对象,然后可以包含对Trunk对象的引用。
在案例3中,律师是唱片公司执行官的代表;建立此模型的正确方法是让您的RLExective对象持有对其知道的一个或多个律师的引用,并在需要时让RLExecutive在任何一位律师上调用SueCollegeStudentOrGrandmother()方法。
在此层次结构中,您说ErrorHandler 是dbCon的类型。这没有任何意义。更确切地说,ErrorHandler是dbCon的委托,负责处理错误。在这种情况下,您可能需要一个自由浮动的ErrorHandler对象,或者可能需要具有有关DB错误的特定知识的对象。每当dbCon收到它想要显示的错误时,它会通过ShowError()方法将错误抛出到ErrorHandler。
根据您的评论,您的混淆似乎在于 extends 的含义。通过说ErrorHandler extends dbCon,您已经说过ErrorHandler是dbCon的子类,而不是ErrorHandler为dbCon添加了额外的功能。这意味着您必须创建一个ErrorHandler实例,它将具有dbCon 和 ErrorHandler的功能。这可能不是你想要的。
希望这是有道理的。
答案 1 :(得分:1)
您可以实现自己的例外处理程序:
class Exception_Handler extends Exception {
...
}
class DB_Connection {
try {
throw new Exception_Handler('Cannot connect to DB: ' . $exception->getMessage() . '.');
} catch (Exception_Handler $exception) { $exception->show(); }
}
答案 2 :(得分:0)
我建议你阅读Polymorphism。
从父类调用ShowError()
将由实例的类确定,这在运行时完成。
为了演示,请考虑以下代码:
<?PHP
abstract class dbCon {
public function OpenConnection() {
// Do Something;
// On error:
$this->ShowError();
}
abstract function ShowError();
}
class ErrorHandling extends dbCon {
public function ShowError() {
// Show error
echo "Error is here\n";
}
}
class WarningHandling extends dbCon {
public function ShowError() {
// Show waring
echo "Warning is here\n";
}
}
$ErrorHandling = new ErrorHandling();
$ErrorHandling->OpenConnection();
$WarningHandling = new WarningHandling();
$WarningHandling->OpenConnection();
?>
运行时,您将获得:
Error is here
Warning is here
为什么?
因为,第一个ShowError()
来自ErrorHandling
类型的对象。 PHP发现该对象来自具体类型ErrorHandling
,因此当从ShowError()
调用OpenConnection
时,php使用对象类型(ErrorHandling
)中的函数。
第二个ShowError()
调用来自WarningHandling
的对象,因此PHP正在使用ShowError()
的{{1}}。
仔细看看Polymorphism。多态性是OOP最重要的概念之一(因为它只是基于对象的一个缺失)。
希望这有帮助。