4

次のように、派生クラスから基本クラスのプロパティを設定しています。

public abstract class Coverter
{
    public Mydata data { get; set; }
    public abstract void Convert();

}
public class Mydata
{
    public int i;
}
public class Coverter1 : Coverter
{
    public Coverter1(Mydata data1)
    {
        data = data1;
    }

    public override void Convert()
    {
        Console.WriteLine(data.i.ToString());

    }
}

private static void Main(string[] args)
{
    Mydata data = new Mydata();
    data.i = 5;
    Coverter c = new Coverter1(data);
    c.Convert();
    Console.ReadLine();
}

この種の実装に欠陥はありますか? より良いアプローチは何ですか?

次のアプローチでも同じことができます。

public abstract class Coverter
    {
        public Mydata data { get; set; }
        public abstract void Convert();

    }

    public class Mydata
    {
        public int i;
    }
    public class Coverter1:Coverter
    {
      override public void Convert()
      {
          Console.WriteLine(data.i.ToString());

      }
    }
    static void Main(string[] args)
    {
        Mydata data1 = new Mydata();
        data1.i = 5;
        Coverter c = new Coverter1();
        c.data = data1;
        c.Convert();
        Console.ReadLine();
    }

どちらのアプローチが優れていますか?

4

1 に答える 1

3

コンストラクターでフィールドを渡します。(注: 通常、フィールドには小文字で、プロパティには大文字で名前を付ける必要があります)。ネーミングを修正した例を次に示します。

public abstract class Converter
{
    private readonly MyData data;
    protected Converter(MyData data)    
    {
       this.data = data;
    }

    public MyData Data { get { return data; } }    
}

public class MyData
{        
    private readonly int value;
    public MyData(int value)
    {
       this.value = value;
    }

    public int MyValue { get { return value; } }
}

public class Converter1 : Converter
{
   public Converter1()
      : base(new MyData(5))
   {
   }
}

最初は読み取り専用フィールドとプロパティのみに getter を使用することをお勧めします。そうすることで、型が不変になり、通常はプログラムを最初に正しくするのに役立ちます。不変から始めて、必要な場所に必要なときにだけ可変性を導入します。このように型を不変にするには、コンストラクターを介して値を渡す必要があります。

于 2013-08-29T08:53:15.347 に答える