2014-10-01 4 views
0

PHP에서는 인터페이스 또는 추상 클래스를 사용한 적이 없지만 비슷한 객체 (이 경우에는 네트워크 스위치)를 지원하지만 더 많은 기능을 추가하고자하는 시점에 이르렀습니다. 미래. SSH (PHPSecLib)를 통해 그들과 통신하고 상호 작용이 다른 경우 실제 방법은 동일합니다.인터페이스 및 추상 클래스 이해

내 경우에는 상수, 개인 변수, 연결 함수 및 생성자/소멸자를 구현하는 추상 클래스는 적절할 것이라고 생각합니다. 확장 클래스는 인터페이스를 템플릿으로 사용하지만 각각의 확장 클래스는 여전히 그들 사이에 같은 메소드를 다시 구현할 것이다.

추상적 인 클래스가이 시나리오로 나아갈 수있는 방법이라고 생각하면 맞습니까? 확장 클래스에 의해 오버라이드되는 추상 클래스에 빈 메소드를 배치해야합니까? 또는 확장 클래스가 Abstract 클래스에없는 메소드를 가질 수 있습니까?

예 :

<?php 

    set_include_path(get_include_path() . PATH_SEPARATOR . '/home/devicepo/public_html/include/PHPSecLib'); 

    include('Net/SSH2.php'); 
    include('File/ANSI.php'); 

    abstract class Switch 
    { 
     const STATUS_UNKNOWN = "-1"; 
     const STATUS_OFFLINE = "0"; 
     const STATUS_ONLINE = "1"; 

     public $conn; 

     private $_server; 
     private $_username; 
     private $_password; 

     private $_bashshell; 

     public function __construct($server, $username, $password) 
     { 
      if (!$server) 
       die("Switch configuration not Defined"); 

      $this->_server = $server; 
      $this->_username = $username; 
      $this->_password = $password; 
     } 

     public function connect() 
     { 
      // Establish new SSH2 Connection 
      $this->conn = new Net_SSH2($this->_server, 22); 

      if(!$this->conn->login($this->_username, $this->_password)) 
      { 
       die("Failed to connect to Switch: " . $this->_server); 
      } 
     } 

     public function enable_port($port) 
     { 
      // Define in extended classes 
     } 

     public function disable_port($port) 
     { 
      // Define in extended classes 
     } 
    } 

?> 

답변

1

나는 당신의 경우에는 추상 클래스가 갈 수있는 방법이라고 생각합니다.

  1. 아이 클래스

  2. 아이 클래스는 유사성의 개념이 부모 클래스와 코드의 큰 부분을 공유하는 이유는 점이다.

점 2와 관련하여 더 자세히 설명하기 위해 동일한 인터페이스를 구현하는 두 클래스가 반드시 관련되지는 않습니다. 인터페이스는 능력을 나타냅니다. 예를 들어 비행기와 새를 생각해보십시오. 두 가지 모두 플라이 가능한 인터페이스를 구현할 수 있지만 그 밖의 방법으로는 관련이 없습니다. 반면에, 당신의 아이 클래스는 비슷한 타입을 가지고 있습니다. 그것들은 모두 스위치입니다. 그래서 추상 클래스는

abstract class BasicSwitch { // You cannot use the name switch 

    const STATUS_UNKNOWN = "-1"; 

    const STATUS_OFFLINE = "0"; 

    const STATUS_ONLINE = "1"; 

    public $conn; 

    private $_server; 

    private $_username; 

    private $_password; 

    private $_bashshell; 

    public function __construct($server, $username, $password) { 

     if (!$server) die("Switch configuration not Defined"); 

     $this->_server = $server; 

     $this->_username = $username; 

     $this->_password = $password; 
    } 

    public function connect() { 

     // Establish new SSH2 Connection 

     $this->conn = new Net_SSH2($this->_server, 22); 

     if(!$this->conn->login($this->_username, $this->_password)) { 

      die("Failed to connect to Switch: " . $this->_server); 
     } 
    } 

    abstract public function enable_port($port); 

    abstract public function disable_port($port); 
} 

수 및 구체적인 구현은 가장 중요한 여기 염두에두고 생각

class CiscoSwitch extends BasicSwitch { 

    public function __construct($server, $username, $password) { 

     parent::__construct($server, $username, $password); 
    } 

    public function enable_port($port) { 

     echo 'Port is enabled'; 
    } 

    public function disable_port($port) { 

     echo 'Port is disabled'; 
    }    
} 

이 CiscoSwitch도 BasicSwitch의 유형입니다 것입니다 수 있습니다. 즉, CiscoSwitch는 BasicSwitch가 예상되는 곳이면 어디에서나 사용할 수 있습니다. 따라서 많은 스위치가있는 랙이 있고 랙의 모든 스위치에 동일한 포트를 사용하려는 경우를 고려하십시오. 여기 랙 클래스입니다 :

class Rack { 

    protected $switches; 

    public function addSwitch(BasicSwitch $switch) { 

     $this->switches[] = $switch; 
    } 

    public function enable_ports($port) { 

     foreach($this->switches as $switch) { 

      $switch->enable_port($port); 
     } 
    } 
} 

당신이 구현 추상 클래스 (BasicSwitch)과하지에 힌트를 입력하면 랙 내부에 스위치가 포트를 활성화하거나 비활성화 할 수 있음을 확신 할 수 있습니다. 당신은 정말로 어떤 스위치인지 신경 쓰지 않습니다. 당신은 그 일을 할 수 있다는 것을 알고 있습니다. 이것은 인터페이스의 코드이며 구현이 아닌 코드입니다. 이렇게하면 코드가 확장 기능을 위해 열려 있지만 수정을 위해 닫힙니다. 원하는만큼의 스위치 유형을 만들 수 있지만 Rack 클래스가 계속 작동 할 것입니다.

관련 문제