Как вернуть интерфейс

Статус
В этой теме нельзя размещать новые ответы.

Potaevsky

Новичок
Как вернуть интерфейс

У меня есть интерфейс... Как мне вернуть не класс который его имплементит, а именно сам интерфейс?
 
Potaevsky
Класс, между прочем, может имплементить много интерфейсов. Можешь описать подробнее, для чего тебе это нужно?.

У меня есть клизма, но как мне воспользоваться ею для чистки зубов но через ухо?
 

Potaevsky

Новичок
Сейчас:

interface IA {
function foo();
}

class A implements IA {
public function foo () {...}
public function bar () {...}
}

class B {
public function getIA()
{
$a = new A();
return ????? ;
}
}

$b = new B();
$ia = $b->getIA();

Нужно сделать так чтобы в $ia лежал не класс A, а интерфейс IA, то есть чтобы метода bar() в $ia не было, а был только foo() - то бишь то что описано в интерфейсе IA. Вот...
 
Potaevsky
Нужно почитать документацию. Не знаешь дела не вылазь на тело. И не надо тон повышать многократными знаками вопроса, надо думать.

-~{}~ 01.08.07 15:05:

Potaevsky
Что тут пояснять. ЧИТАЙ ДОКУМЕНТАЦИЮ! Не знаешь элементарных понятий а уже "орхитектор" ггг.

-~{}~ 01.08.07 15:07:
Код:
interface A { public function foo(); }
class aimplm implements A { public function foo() { echo 'foo'; } static public function getA() { $ref = __CLASS__; return new $ref; } }
interface B { public function bar(A $object); } class bimplm implements B { public function bar(A $object) { $object->foo(); } }
$b = new bimplm(); $b->bar(aimplm::getA());
работает?
 

Potaevsky

Новичок
mishco, я вижу ты очень опытный перец, если не понимаешь базовых вещей других языков. Я хочу ограничить доступ на вызов методов в классе который имплементит мой интерфейс ТОЛЬКО методами интерфейса.
 
Я понял что ты имел ввиду. Ты хочешь кастовать, да?.
Но какой у этого смысл, если ты работаешь с объектом интерфейс которого тебе известен?
... function blah(Interface $object) ... <--- зачем здесь использовать методы которые не предусмотрены интерфейсом?
Хочешь защититься от дурака -- самого себя? Не стоит так упорно сосать пальцы, иначе высосешь проблемы и посерьезнее. А если ты гуру "других языков", то может быть php тебе и не нужен? Знаешь один, и достаточно. Зачем второй, если там все не так как в первом?

P.S. Некоторые "базовые вещи других языков" действительно становятся в php не понятными, так как теряют смысл. Так же как базовые вещи php в других языках..

Можно сделать и так:
PHP:
<?php

	interface Base
	{
		public function hello();
	}

	class Reference
	{
		public function __construct($interface, $instance)
		{
			if (interface_exists($interface) && is_object($instance))
			{
				$this->method = get_class_methods($interface);
				$this->instance = $instance;
				$this->interface = $interface;
			}
			else
			{
				throw new RuntimeException();
			}
		}
		public function __call($method, $arguments)
		{
			if (in_array($method, $this->method))
			{
				call_user_func_array(array($this->instance, $method), $arguments);
			}
			else
			{
				throw new RuntimeException();
			}
		}
		//
		private $method;
		private $instance;
		private $interface;
	}
	
	class BaseImplementation implements Base
	{
		public function hello()
		{
			echo 'hello';
		}
		public function world()
		{
			echo 'world';
		}
	}
	
	class Factory
	{
		static
		public function fetchBase()
		{
			return new Reference('Base', new BaseImplementation());
		}
	}
	
	$object = Factory::fetchBase();
	$object->hello();
	$object->world();
Но зачем?.

Potaevsky
Гыыыыыыыыы.. Давай по порядку. Какие базовые вещи каких других языков ты имеешь ввиду?. И что за ересь ты несешь? Имеешь ввиду private наследование из CPP? И зачем тебе такое нужно, о горе гуру базовых вещей других языков.
Можешь подскажешь дурачку как бы ты вернул pure virtual класс в этом языке ;)?
И для такого ограничения есть область видимости protected вообще-то.

interface ia
{
protected function blah();
}

class aimplm implements ia
{
protected function blah() { } <--- "извне" этот метод не вызвать, читаем документацию.
}

PHP это PHP. Другие языки это другие языки. У каждого языка своя специфика, свое предназначение, и соответствующие рамки и ограничения. И вместо того что бы воротить костыль потому что так можно было сделать где-то но нельзя сделать здесь, нужно просто думать.

И что бы не конфликтовать больше, давай лучше ты напишешь задачу в целом, а не только предполагаемое тобой её решение.
 

Potaevsky

Новичок
michro, спасибо, мысль понятна. Изврат, но вариант.

Хочешь защититься от дурака -- самого себя?
=======
Я очень редко пишу один. Да и почему бы собственно не позаботиться о собственной забывчивости. Я не знаю как я буду помнить какой-либо проект через скажем год.
 
Potaevsky
Ну в общем-то подобные проблемы и меня самого преследуют до сих пор, все же cpp это религия.
 

Potaevsky

Новичок
Автор оригинала: mishco
Potaevsky
Ну в общем-то подобные проблемы и меня самого преследуют до сих пор, все же cpp это религия.
Согласен... Я java имел ввиду, там проще с этим несколько...
 

kvf77

Red Devil
Тема закрыта.

Проблемы личного характера и бессмысленные споры между участниками не являются предметом обсуждения форума.
Обсуждайте их в привате.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху