2014-06-19 49 views
2

我想要一个类的版本控制系统,它允许一个系统与另一个系统进行通信,以便任何未来的更改不会影响已经存在的内容。将一个类转换为另一个类

让我们假设系统A和系统B通过RPC调用相互通话。业务需求的变化和系统A和B需要为未来的发展,同时向后兼容

下将工作进行更改:

class base_version 
{ 

    public static function getVersion($version = 1) 
    { 
     $versionClass = 'version_'.$version; 
     return new $versionClass(); 
    } 

} 

class version_1 
{ 
    public function sayHello() 
    { 
     echo "Hello version 1\n"; 
    } 
} 

class version_2 
{ 
    public function sayHello() 
    { 
     echo "Hello version 2\n"; 
    } 
} 


$obj = base_version::getVersion(); 
$obj->sayHello(); 

$obj = base_version::getVersion(2); 
$obj->sayHello(); 

我不喜欢但是静态实例化。我想要做的是这样的事情,除非我知道你不能重新分配$this

class base_version 
{ 
    public function __construct($version) 
    { 
     $versionClass = 'version_'.$version; 
     $this = new $versionClass(); 
    } 
} 


$obj = new base_version(); 
$obj->sayHello(); 

$obj = new base_version(2); 
$obj->sayHello(); 

我该如何做到这一点?

+0

接口是理想的,因为它们定义了一个没有实现细节的'合同'。虽然'抽象类'在一些圈子中也被认为是'接口'。一些信息:[design-pattern-principles-for-php-program-to-an-interface-not-an-implementation](http://www.php5dp.com/design-pattern-principles-for-php-program -to-AN-接口不-AN-实现/) –

回答

1

我认为,用抽象类与定义的构造函数,你可以做一些接近。让我们提醒我们,抽象类需要至少有一个抽象函数,但是也可以具有'具体'[原文] *函数,这对每个继承类都是相同的。抽象类不能实例化,只能是他们的孩子。

那就是:

abstract class base_version 
{function __construct($version) 
    {$this->version = $version; 
    switch ($this->version) 
    {case 1: 
     // construct for class 1 
     break; 
     case 2: 
     // construct for class 2 etc. 
     break; 
     default: 
     // for careless programmers who won't define the constructor in the future 
     break;}} 
    function version() 
    {return $this->version;} 
    abstract function sayHello();} 

这是一个基础抽象类。如果您的业务需求发生变化,您可以在构造函数中为这些新类添加案例。

class greeter extends base_version 
{function sayHello() 
    {return 'This is the old version' . $this->version(); 
    }} 

class new_greeter extends base_version 
{function sayHello() 
    {return 'Hello version ' . $this->version(); 
    }} 

这里的抽象类的一点是,如果扩展抽象类的类不抛出错误,它必须实现一个功能sayHello()

这样一来,凡是扩展base_version类的人都不会破坏程序,因为对象至少都具有在基类中定义为抽象的那些函数。

所以它ISS,办法定义可以在时间不打破旧的在C工作

$obj = new greeter(1); 
$obj ->sayHello(); 
$obj2 = new new_greeter(2); 
$obj2->sayHello(); 
  • “具体”的方式++有特定的含义转班,我不在这里使用它并不想冒犯任何人,即使它不完全相同
相关问题