Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
interface someInterface{
public function someMethod(Bar $bar, array $options, $property);
}
interface anotherInterface{
public function someMethod();
}
class Foo implements someInterface,anotherInterface {
public function someMethod(){
echo 'someMethod() was called'.PHP_EOL;
}
}
public interface someInterface {
public void someMethod(Object object, Iterator iterator);
}
public interface anotherInterface {
public void someMethod();
}
public class fooClass implements anotherInterface,someInterface {
/**
* @param args
*/
public static void main(String[] args) {
fooClass fooClass = new fooClass();
fooClass.someMethod();
}
@Override
public void someMethod() {
System.out.println("someMethod() was called");
}
@Override
public void someMethod(Object object, Iterator iterator) {
System.out.println("someMethod(Object object, Iterator iterator) was called");
}
}
это два разным метода с точки зрения ооп
interface Test {
void test(int a);
void test(int a, int b);
}
interface Test {
function test($a) {}
function test($a, $b) {}
}
int test1()
{
return 42;
}
int test2(int a,int b)
{
return a+b;
}
void main ()
{
int (*f)() = test2; // указатель на функцию
printf ("test results: %d, %d \n", test1(2), f());
}
test.cpp:11:12: error: ‘::main’ must return ‘int’
test.cpp: In function ‘int main()’:
test.cpp:12:14: error: invalid conversion from ‘int (*)(int, int)’ to ‘int (*)()’
test.cpp:13:43: error: too many arguments to function ‘int test1()’
test.cpp:3:5: note: declared here
, … в конец всех параметров.произвольное количество аргументов для любой функции не является причиной отсутствия перегрузки функций в php
В таком случае с Вас пример, в котором функция принимает произвольное количество аргументов и может быть перегружена по количеству аргументов.
class A {
public:
virtual int a (int i, ...) {
return i;
}
virtual int a (int i1, int i2, ...) {
return i1 * i2;
}
};
#include <iostream>
using namespace std;
int main () {
A a;
cout << a.a (1) << endl;
cout << a.a (2, 2) << endl;
return 0;
}
am /tmp $ g++ a.cpp
am /tmp $ ./a.out
1
4
Интерфейсы были придуманы как раз для того, что бы разрешить коллизию возникающую при множественном наследовании классов. Ведь если говорить грубо, то интерфейс это только «набор инструкций», который говорит, что класс имплементирующий его должен реализовать такие то методы. Интерфейс не содержит реализацию метода, по этому, классу «всё равно» если ему приходится имплементировать множество интерфейсов с одинаковыми методами.interface BaseInterface
{
public function testMethod();
}
interface TestInterface extends BaseInterface
{
}
interface TestInterface2 extends BaseInterface
{
}
class TestClass implements TestInterface, TestInterface2
{
public function testMethod()
{
}
}
namespace ExplicitInterfaceImplementation
{
interface ITest1
{
void TestMethod( );
}
interface ITest2
{
void TestMethod( );
}
class Test : ITest1, ITest2
{
void ITest1.TestMethod( )
{
Console.WriteLine( "ITest1" );
}
void ITest2.TestMethod( )
{
Console.WriteLine( "ITest2" );
}
public void TestMethod( )
{
Console.WriteLine( "Just test" );
}
}
class Program
{
static void Main( string[] args )
{
Test t = new Test();
t.TestMethod();
((ITest1)t).TestMethod();
((ITest2)t).TestMethod();
}
}
}
Just test
ITest1
ITest2
public abstract class someClass {
abstract public void method();
}
public abstract class anotherClass extends someClass {
abstract public void method();
}
public class main extends anotherClass {
/**
* @param args
*/
public static void main(String[] args) {
main main = new main();
main.method();
}
@Override
public void method() {
System.out.println("method() was called");
}
}
<?php
$vasia = new Foo();
$vasia->someMethod();
AppendIterator extends IteratorIterator implements OuterIterator , Traversable , Iterator {
ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable {
$observable1->setObserver((IObserver1)$observer); //приведение для наглядности по идее
$observable2->setObserver((IObserver2)$observer); проще, чем$observable1->setObserver($observer->getObserver1Adapter());
$observable2->setObserver($observer->getObserver2Adapter());или$observable1->setObserver(new Observer1Adapter($observer);
$observable2->setObserver(new Observer2Adapter($observer);
Тонкости (странности?) работы с интефейсами