2014-06-19 73 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(); 
  • 「具體」的方式++有特定的含義轉班,我不在這裏使用它並不想冒犯任何人,即使它不完全相同
相關問題