web-dev-qa-db-ja.com

「実装」はクラスで何をしますか?

クラスが別のクラスを実装する場合...それはどういう意味ですか?私はこのコードサンプルを見つけました: http://www.Java2s.com/Code/Php/Class/extendsandimplement.htm

しかし、残念ながら、それについての説明はありません...

31
Webnet

Implementsは、インターフェイスが指定する指定された動作を取ることを意味します。次のインターフェースを検討してください。

_public interface ISpeak
{
   public String talk();
}

public class Dog implements ISpeak
{
   public String talk()
   {
        return "bark!";
   }
}

public class Cat implements ISpeak
{
    public String talk()
    {
        return "meow!";
    }
}
_

CatクラスとDogクラスの両方がISpeakインターフェイスを実装します。

インターフェースの素晴らしい点は、ISpeakインターフェースを介してこのクラスのインスタンスを参照できるようになったことです。次の例を考えてみましょう。

_  Dog dog = new Dog();
  Cat cat = new Cat();

  List<ISpeak> animalsThatTalk = new ArrayList<ISpeak>();

  animalsThatTalk.add(dog);
  animalsThatTalk.add(cat);

  for (ISpeak ispeak : animalsThatTalk)
  {
      System.out.println(ispeak.talk());
  }
_

このループの出力は次のようになります。

樹皮!
ニャー!

インターフェースは、実装クラスが何であるかを公開せずに、クラスdoに基づいてクラスと対話する手段を提供します。

たとえば、Javaで使用される最も一般的なインターフェイスの1つは Comparable です。オブジェクトがこのインターフェイスを実装している場合、消費者がオブジェクトのソートに使用できる実装を作成できます。

例えば:

_public class Person implements Comparable<Person>
{
  private String firstName;
  private String lastName;

  // Getters/Setters

  public int compareTo(Person p)
  {
    return this.lastName.compareTo(p.getLastName());  
  }
}
_

次のコードを検討してください。

_//  Some code in other class

List<Person> people = getPeopleList();

Collections.sort(people);
_

このコードが行ったことは、Personクラスに自然な順序付けを提供することでした。 Comparableインターフェイスを実装したため、Collections.sort()メソッドを活用して、ListPersonオブジェクトをその自然な順序で並べ替えることができました。姓、名で。

106
Wayne Hartman

Javaのインターフェースを調べる必要があります。簡単なGoogle検索で このページ が明らかになりました。

私はinterfaceをある種の「約束」と考えるのが好きです。それを実装するクラスは、期待できる特定の動作を持っているため、実装クラスのインスタンスをインターフェース型に入れることができます。参照。

簡単な例は_Java.lang.Comparable_インターフェイスです。このインターフェイスのすべてのメソッドを独自のクラスに実装することにより、オブジェクトは互いに「同等」であり、部分的に順序付けできると主張しています。

インターフェイスを実装するには、2つの手順が必要です。

  1. インターフェイスがクラス宣言で実装されることを宣言する
  2. インターフェイスの一部であるすべてのメソッドの定義を提供します。

インターフェイス_Java.lang.Comparable_には、public int compareTo(Object other)という1つのメソッドしかありません。そのため、そのメソッドを提供する必要があります。

以下に例を示します。このクラスRationalNumberを考えると:

_public class RationalNumber
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }
}
_

(注:Javaパブリックフィールドを持つのは一般的に悪い習慣ですが、これは非常に単純なプレーンオールドデータ型にするつもりなので、パブリックフィールドは気にしません!)

2つのRationalNumberインスタンスを比較できるようにしたい場合(ソートの目的で、おそらく?)、_Java.lang.Comparable_インターフェースを実装することでそれを行うことができます。そのためには、2つのことを行う必要があります。compareToの定義を提供し、インターフェイスが実装されていることを宣言します。

肉付けされたクラスの外観は次のとおりです。

_public class RationalNumber implements Java.lang.Comparable
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }

    public int compareTo(Object other)
    {
        if (other == null || !(other instanceof RationalNumber))
        {
            return -1; // Put this object before non-RationalNumber objects
        }

        RationalNumber r = (RationalNumber)other;

        // Do the calculations by cross-multiplying. This isn't really important to
        // the answer, but the point is we're comparing the two rational numbers.
        // And no, I don't care if it's mathematically inaccurate.

        int myTotal = this.numerator * other.denominator;
        int theirTotal = other.numerator * this.denominator;

        if (myTotal < theirTotal) return -1;
        if (myTotal > theirTotal) return 1;
        return 0;
    }
}
_

おそらく考えているのですが、このすべてのポイントは何でしたか?答えは、 this のようなメソッドを見るときです:「何らかの種類の比較可能なオブジェクト」を単に期待するソートアルゴリズム。 (すべてのオブジェクトが_Java.lang.Comparable_!を実装しなければならないという要件に注意してください。)そのメソッドは、StringsまたはIntegersまたはRationalNumbersのいずれかの種類の比較可能なオブジェクトのリストを取ることができます。

注:この回答では、Java 1.4のプラクティスを使用しています。_Java.lang.Comparable_は現在、汎用インターフェイスですが、汎用を説明する時間はありません。

6
Platinum Azure

インターフェイスはクラスを介して実装されます。必要に応じて、これらは純粋に抽象クラスです。

In PHPクラスがインターフェースから実装される場合、そのインターフェースで定義されたメソッドは厳密に従う必要があります。クラスが親クラスを継承する場合、メソッドのパラメーターは変更される場合があります。インターフェイスの場合:

interface ImplementMeStrictly {
   public function foo($a, $b);
}

class Obedient implements ImplementMeStrictly {
   public function foo($a, $b, $c) 
      {
      }
}

インターフェイスが定義どおりに実装されていないため、エラーが発生します。一方、

class InheritMeLoosely {
   public function foo($a)
      {
      }
}

class IDoWhateverWithFoo extends InheritMeLoosely {
   public function foo()
      {
      }
}

許可されている。

2
Linus Kleen

interfaceは、メソッド定義のリスト(本体なし)と考えることができます。クラスがimplementとインターフェースを望んでいる場合、インターフェースにリストされているすべてのメソッドの実装を提供すると言って、契約を締結しています。詳細については、 http://download.Oracle.com/javase/tutorial/Java/concepts/ を参照してください

2
mfonda

Javaクラスはインターフェースを実装できます。詳細については http://en.wikipedia.org/wiki/Interface_(Java )を参照してください。PHPについてはわかりません。

お役に立てれば。

0
cjstehno

インターフェイスは、すべての実装クラスが実装する必要があるメソッドの単純なコントラクトを定義します。クラスがインターフェイスを実装するとき、そのすべてのメソッドの実装を提供する必要があります。

ポスターは、言語に関するある程度の知識を前提としていると思います。

0
Peter Lawrey

これはインターフェースと呼ばれます。多くのOO言語にはこの機能があります。ここのphpの説明を読むことをお勧めします。 http://de2.php.net/interface

0
FlorianH