2014-06-19 3 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

인터페이스는 구현 세부 사항이없는 '계약'을 정의하므로 이상적입니다. '추상 클래스'는 일부 서클에서 '인터페이스'로 간주 되기는하지만. 몇 가지 정보 : [디자인을위한 원칙 - 패턴을위한 PHP 프로그램과 인터페이스가 아닌 구현] (http://www.php5dp.com/design-pattern-principles-for-php-program) 인터페이스가 아닌 구현 /) –

답변

1

저는 정의 된 생성자가있는 추상 클래스를 사용하면 그와 비슷한 것을 할 수 있다고 생각합니다.

추상 클래스는 적어도 하나의 추상 함수를 가져야하지만 각 상속 클래스에 대해 동일한 'concrete'[sic] * 함수를 가질 수도 있음을 상기시켜줍니다. 추상적 인 수업은 인스턴스화 될 수 없으며 자녀들 만 인스턴스화 될 수 있습니다.

는 여기있다 :

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을 확장 한 클래스를 만드는 사람이라면 누구든지 기본 클래스에서 abstract로 정의 된 함수를 모두 가질 수 있기 때문에 프로그램을 중단하지 않습니다. 그래서 거기는 ISS, 할 수있는 방법은 특별한 의미를 가지고 ++ 이전 것들은 다에

$obj = new greeter(1); 
$obj ->sayHello(); 
$obj2 = new new_greeter(2); 
$obj2->sayHello(); 
  • '콘크리트'의 작업 방식을 파괴하지 않고 시간을 변경할 수 있습니다 클래스를 정의

    , I 돈

관련 문제