0

抽象メソッド f1() のみを含み、他には何も含まないCTestという抽象クラスがあります。同様に、唯一のメソッド f1() を持つInterface ITestがあります。ここでは、CTest 抽象クラスと ITest インターフェイスの両方が同じことを行います。

1 つの違いは、インターフェイスは、他のクラスから既に派生しているが抽象クラスではできない任意のクラスに実装できるという柔軟性を提供することです。

上記の違いとは別に、これら2つの実際の違いは何ですか? ここで効率的なのはどれですか(CTestまたはITest)?いつ何を使えばいいですか?オブジェクト指向設計の特定のシナリオと、これに関する一般的な提案は役に立ちます

4

8 に答える 8

2

継承以外はシナリオ依存。優れた例を含むこのコード プロジェクトの記事を確認してください。

【記事より】

3 つのクラスを作成する必要があるとします。最初は CAR、2 番目は MAN、3 番目は WOMAN です。次に、それらの移動方法を定義するために、それぞれに関数が必要です。これで 3 つすべてが移動できるようになりましたが、CAR は MAN と WOMAN とはまったく異なる方法で移動します。したがって、ここでは Interface IMOVEMENT を使用し、関数 MOVE を宣言します。これで、3 つのクラスすべてがこのインターフェイスを継承できます。というわけで、授業はこんな感じ。

public interface IMovement
{
    void Move();
}

public class Car : IMovement
{
    public void Move()
    {
        //Provide Implementation
    }
}

public class Man : IMovement
{
    public void Move()
    {
        //Provide Implementation
    }
}

public class Woman : IMovement
{
    public void Move()
    {
        //Provide Implementation
    }
}

しかし、MAN と WOMAN は同じように歩くため、2 つの異なる方法で同じ動作を提供することはコードの冗長性になります。簡単に言えば、コードは再利用されません。したがって、人間の動きの抽象クラスを定義できるようになり、このクラスを HUMANBEINGMOVEMENT にすることができます。また、同じことが CAR クラスにも適用できます。自動車には多くのメーカーがあり、すべての自動車が同じように動くため、CARSMOVEMENT である自動車の動きの抽象クラスを定義することもできます。したがって、リファクタリングされたコードは .

public interface IMovement
{
    void Move();
}

public abstract class CarsMovement : IMovement
{

    public virtual void Move()
    {
        //default behavior for cars movement
    }
}

public class SuzukiCar : CarsMovement
{
    public override void Move()
    {
        //Provide Implementation
    }
}

public abstract class HumanBeingMovement : IMovement
{

    public virtual void Move()
    {
        //default behavior for human being movement
    }
}

public class Man : HumanBeingMovement
{
    public override void Move()
    {
        //Provide Implementation
    }
}

public class Woman : HumanBeingMovement
{
    public override void Move()
    {
        //Provide Implementation
    }
}
于 2012-08-07T05:31:38.600 に答える
1

Java優先InterfacesAbstract Classesます。有効な Javaの項目 18 を参照してください。

ここに画像の説明を入力

主なポイント

  • 既存のクラスを後付けして、新しいインターフェイスを実装できます。

  • インターフェイスは、ミックスインを定義するのに理想的です。

  • インターフェイスは、非階層型フレームワークの構築を可能にします。

  • インターフェイスにより、安全で強力な機能拡張が可能になります。

于 2012-08-07T05:30:06.543 に答える
0

この場合、違いはありませんが、 CTest クラスには Class として継承できる唯一のクラスがあります。ただし、ITest インターフェイスは、他のクラスおよびインターフェイスに同時に継承できます。

于 2012-08-07T05:31:48.873 に答える
0

あなたが言及したシナリオでは、定義のないメソッドが1つしかないため、最適な方法はインターフェースです。

インターフェースが Java に与える主な利点は、複数のインターフェースを実装できますが、拡張できるクラスは 1 つだけです。したがって、すでに 1 つの抽象クラスを拡張している場合、他のクラスを拡張するオプションはありません。

ゴールデン ルール:メソッドを定義するだけで宣言する必要がない場合、インターフェイスは抽象クラスよりも優れています。

あなたの場合はインターフェースの方が優れていると言いましたが、プログラマーは自分のコードを将来の視点から考えるべきです。あなたが作成しているクラス/インターフェイスには、将来さらに多くのメソッドが追加されると思いますか? これらのメソッドを定義しますか、それとも単に宣言しますか? これらの質問に答えると、インターフェイスで十分かどうか、または抽象クラスが必要かどうかがわかります。

于 2012-08-07T05:32:09.990 に答える
0

アドバンテージ:

抽象クラスのメソッドルックアップはインターフェースよりも高速であるため、抽象クラスの実装はインターフェースよりも優れています。インターフェイスを変更する場合は、実装クラスを更新する必要がありますが、抽象クラスを変更しても、実装クラスには影響しません。

不利益:

If you want to implement more than one parent class method , it is not possible.
But regarding to interface you can implement more than one.
于 2012-08-07T05:36:35.297 に答える
0

この場合、抽象クラスに抽象メソッドのみが含まれると仮定すると、私の意見では、インターフェイスを使用する必要があります。抽象メソッドとインターフェースを持つ抽象クラスは同じ目的を果たしますが、拡張できるのは 1 つのクラスだけで、必要な数だけ実装できるため、他のクラスから一部の機能を継承することを決定した場合でも、コードが大幅に変更される可能性が低くなります。

あなたの質問について:しかし、これら2つの実際の違いは何ですか? ここで効率的なのはどれですか(CTestまたはITest)?いつ何を使えばいいですか?オブジェクト指向設計の特定のシナリオと、これに関する一般的な提案は役に立ちます

インターフェイスはコントラクトに似ています。クラスがインターフェイスを実装すると、実装が保証されます。これは通常、誰かが機能を提供したいが、内部コードを明らかにしたくない場合に役立ちます。そのため、開発者はインターフェイスを破棄するだけで、各メソッドがどのように実装されているかを知らなくても呼び出しを行うことができます。もちろん、好きなだけインターフェイスを実装できます。

抽象クラスを使用すると、指定された特定の動作と、将来実装するために残されているその他の動作を持つクラスを作成できます。ただし、インターフェイスとは異なり、各クラスは 1 つのクラスしか拡張できないため、この観点から注意してクラスを拡張する必要があります。抽象クラスを使用すると、1 つのクラスに動作を注入して、その動作をその子クラスに自動的に広げることもできます。これにより、通常、開発/保守の特定のセクションが容易になります。

于 2012-08-07T05:30:04.310 に答える
0

C# では、単一レベルの継承のみが許可されます。したがって、インターフェイスを使用して複数の継承を行うことができます

また、詳細については:

http://www.dotnetfunda.com/forums/thread4085-difference-between-interface-and-abstract-class.aspx

http://sadi02.wordpress.com/2008/05/08/what-is-difference-in-an-abstract-class-and-an-interface/

于 2012-08-07T05:28:26.970 に答える
0

私にとっては、ここでインターフェースを使用する方が良いです。そこにコードを抽出できる場合は、抽象クラスを使用する必要があります(メソッドを実装できるか、それを呼び出したい他のものがあります)。

于 2012-08-07T05:28:31.990 に答える