27

インターフェイスは関数の戻り型にすることができます。はいの場合、利点は何ですか。たとえば、インターフェイスの配列が返される次のコードは正しいです。

public interface Interface
{
    int Type { get; }
    string Name { get; }
}

public override Interface[] ShowValue(int a)
{
.
.

}
4

5 に答える 5

24

はい、インターフェースを返すことができます。

AクラスとBそれぞれがインターフェースを実装するとしましょうIc

public interface Ic
{
    int Type { get; }
    string Name { get; }
}

public class A : Ic
{
     .
     .
     .
}

public class B : Ic
     .
     .
     .
}

public Ic func(bool flag)
{
     if (flag)
         return new A();
       return new B();

}

この例funcはファクトリメソッドのようなものです—異なるオブジェクトを返すことができます!

于 2013-03-13T17:28:45.847 に答える
22

はい、interface非常に有効な戻り値です。インターフェイスの定義を返すのではなく、そのインターフェイスのインスタンスを返すことを忘れないでください。

利点は非常に明確です。次のコードを検討してください。

public interface ICar
{
    string Make { get; }
}

public class Malibu : ICar
{
    public string Make { get { return "Chevrolet"; } }
}

public class Mustang : ICar
{
    public string Make { get { return "Ford"; } }
}

ICarこれで、それぞれの値を持つさまざまなインスタンスを返すことができます。

ただし、インターフェイスを使用する主な理由は、よく知られたコントラクトでアセンブリ間でインターフェイスを共有できるためです。これにより、誰かに渡されたときに、インターフェイスICarについて何も知りませんが、インターフェイスがあることはわかりMakeます。さらに、パブリックインターフェイス以外は実行できません。したがって、名前が付けられMustangpublicメンバーModelがいる場合、それがインターフェースにない限り、彼らはそれに到達することができませんでした。

于 2013-03-13T17:27:56.080 に答える
9

はい、できます。

利点は、戻り (および入力) 型を抽象化できることです。

public interface IFruit{ }

public class Apple: IFruit{}

public class Pear: IFruit{}

...

public function IFruit SelectRandomFromBasket(Basket<IFruit> basket){
  // this function can return Apple, Pear
}
于 2013-03-13T17:27:18.313 に答える
6

はい、それは可能です、そしてそれは公共の行事にとって良いことです。

あなたの質問の理由の部分については、他の人の回答をコピーして貼り付けることはしませんので、たとえば、既存の回答を参照してください。

于 2013-03-13T17:27:53.190 に答える
0

はい、golang の観点からあなたの質問に答えます。戻り値の型としてインターフェイスを使用できます。つまり、int、float、string などの任意のデータ型を返すことができます。

インターフェイス = 任意のデータ型

package main

import (
    "fmt"
)

func any (u interface{}) interface{} {
    fmt.Printf("Type: %T\n",u)
    return u
}

func main(){
    fmt.Println("value: ",any(5))
    fmt.Println(any("testing"))
}

出力

于 2021-09-28T07:24:45.783 に答える