1

流れるように順序付けられたコンストラクターのインターフェイスを作成しています。次のコードを書きました。

public interface IMyObjectFactory: IObjectWithProperty
{
  int objectId { get; set; }
  IObjectWithProperty WithObjectId(int id);
}

public interface IObjectWithProperty
{
  IObjectWithProperty WithObjectId(int id);
  MyObject Create();
}

2番目のインターフェースは、コンストラクターメソッドで順序を強制する必要があります

インプリはこれです:

public class MyObjectFactory: IMyObjectFactory
{
    public int objectId { get; set; }
    private MyObjectFactory() { }
    public static IObjectWithProperty BeginCreation()
    {
        return new ObjectFactory();
    }
    public IObjectWithProperty WithObjectId(int id)
    {
        objectId = id;
        return this;
    }

    public MyObject Create()
    {
        return new MyObject(this);
    }
}

そして、これは私の目的です:

public class MyObject
{
  public int Id { get; set; }
  public MyObject(IMyObjectFactory factory)
  {
    this.Id = factory.objectId;
  }
}

だから私は書くことができます

MyObject mo = MyObjectFactory.BeginCreation().WithObjectId(1).Create();

しかし:

  • コンストラクターのインターフェイスと実装の両方でプロパティを定義する必要があり、あまり好きではありません
  • 静的 BeginCreation メソッドにはインターフェイスがありません
  • 内部で必要な間は、impl プロパティを public に設定する必要があります
  • インターフェイスで、次の警告が表示されます。Warning 7 'FunzIA.DL.Factory.Interfaces.IMyObjectFactory.WithObjectId(int)' hides inherited member 'FunzIA.DL.Factory.Interfaces.IObjectWithProperty.WithObjectId(int)'. Use the new keyword if hiding was intended.

しかし、これは新しい方法ではなく、順序を強制するために 2 番目のインターフェイスが必要です

なにか提案を?ありがとう

4

2 に答える 2

0

私はこのようにします:

  • クラスコンストラクターを表示したくないだけで、ファクトリのみにアクセスできるようにしたい


public interface IMyObjectFactory: IObjectWithProperty
{
  int objectId { get; set; }
}

public interface IObjectWithProperty
{
  IObjectWithProperty WithObjectId(int id);
  MyObject Create();
}

public class MyObjectFactory: IMyObjectFactory
{
  public int objectId;
  private MyObjectFactory() { }

  public static IObjectWithProperty BeginCreation()
  {
    return new MyObjectFactory();
  }

  public IObjectWithProperty WithObjectId(int id)
  {
    objectId = id;
    return this;
  }

  public MyObject Create()
  {
    return new MyObject(this);
  }
}

public class MyObject
{
  public int Id { get; set; }
  public MyObject(IMyObjectFactory factory)
  {
    this.Id = factory.objectId;
  }
}
于 2013-10-15T09:01:40.087 に答える