4

そのクラスの実装が依存性逆転の原則に違反してGenotypesいるかどうかを尋ねたいですか? Individualもしそうなら、それを修正する方法は?

クラス抽象階層

コードは次のとおりです。

public interface IGenotype
{
   //some code...
}

public abstract class AIndividual
{
    // ... some code
    public IGenotype Genotype { get; set;}   // DIP likes that !
}

public class Individual : AIndividual
{
    public Individual()
    {
        // some code ...
        this.Genotype = new Genotype();   // Is this ok in case of DIP? 
    }
}

public class Genotype : IGenotype
{
    // ... some code
}
4

2 に答える 2

3

依存関係逆転の原則は、必ずしもクラスではないソフトウェアモジュールを扱います。アイデアは、下位層がどのようにコーディングされているかに依存する上位層の代わりにinterface、下位層が実装するための抽象クラスを提供することによって上位層が層インターフェースを定義する方が良いということです (C# はこれをうまく提供します)。上位層が必要とするサービスを提供します。よくある間違いは、この原則を依存性注入と混同することです。依存性注入では、依存性を見つけて作成する必要がある依存性クラスではなく、上位レベルによって依存性クラスに提供されます。

依存性注入について質問しているようです。これは、「依存するクラスが依存性のインスタンスをどのように取得するのですか?」ということです。この例は、同じドメイン モデルに属するこれら 2 つのクラスのように見えます。つまり、同じモジュールにある可能性が非常に高いということです。クラスを別のクラスに依存させ、同じモジュール内で直接作成することは妥当なアプローチですが、Factory パターンはクラスが進化するにつれてより堅牢になります。

于 2016-04-29T10:49:41.857 に答える
2

これが役立つことを願っています(コメントを読んでください)

public interface IGenotype
{
   //some code...
}

public class Genotype : IGenotype
{
    // ... some code
}

public class Individual 
{
    // Here, instead of depending on a implementation you can inject the one you want
    private readonly IGenotype genotype; 

    // In your constructor you pass the implementation 
    public Individual(IGenotype genotype)
    {
        this.genotype = genotype;  
    }
}

// Genotype implements IGenotype interface
var genotype = Genotype();

// So here, when creating a new instance you're injecting the dependecy.
var person = Individual(genotype);

DIPに抽象クラスは必要ありません

于 2016-04-29T10:45:46.343 に答える