2

Excelグラフを生成するさまざまなクラスがあります。

各クラスは異なるグラフを生成します。

それらはすべて、異なる値を持つ同じプライベート変数を共有します。

「if」ステートメントがどのグラフであるかを判断するのを防ぐために、一般的なコードを書きたいと思います。

クラスの 1 つの例を次に示します。

using System;

namespace GraphsGenerator
{
   public class GraphOne
   {
       #region Private Members

       private string m_baseDir = "";
       private static string m_graphName = "GraphOne";
       private string m_imageFile = m_graphName + Utils.ImageExtension;

       #endregion Private Members

       #region Properties

       public string BaseDir
       {
           set { m_baseDir = value; }
       }
       public string GraphName
       {
           get { return m_graphName; }
       }
       public string ImageFile
       {
           get { return m_imageFile; }
           set { m_imageFile = value; }
       }

       #endregion Properties

       #region Constructor


       public HandTrackingGraphs(string baseDir)
       {
           m_baseDir = baseDir;
       }

       #endregion Constructor
   }
 }

私はメインでこれをやろうとしました:

List<object> listOfGraphs = new List<object>();
listOfGraphs.Add(new GraphOne());
listOfGraphs.Add(new GraphTwo());
listOfGraphs.Add(new GraphThree());

foreach (object currentGraph in listOfGraphs)
{
   string imageFile = currentGraph.ImageFile;
}

しかし、もちろんこれはできません。

何か案は?

4

5 に答える 5

8

それらはすべて、異なる値を持つ同じプライベート変数を共有します。

それらはすべて、プロパティを公開する同じインターフェイスを実装する必要がありImageFileます。例えば:

public interface IGraph
{
    // TODO: Consider making this read-only in the interface...
    public string ImageFile { get; set; }
}

次に、次のことができます。

List<IGraph> listOfGraphs = new List<IGraph>();
listOfGraphs.Add(new GraphOne());
listOfGraphs.Add(new GraphTwo());
listOfGraphs.Add(new GraphThree());

foreach (IGraph currentGraph in listOfGraphs)
{
   string imageFile = currentGraph.ImageFile;
}

インターフェイスの代わりに抽象基本クラスを使用することもできます。これはもう少し制限的ですが、グラフも共通の実装を共有できることを意味します。

(柔軟性とコードの再利用が本当に必要な場合は、抽象基本クラスによって実装されるインターフェイスを作成することもできます。)

于 2013-10-02T08:54:05.857 に答える
4

しかし、もちろんこれはできません。

インターフェイスを使用して可能です。実行するメソッドを含むインターフェイスを定義します。

public interface IGraphWithImageFile
{
    string ImageFile { get; }
}

次に、すべてのクラスにインターフェイスを適用し、リストを として宣言しますList<IGraphWithImageFile>

于 2013-10-02T08:54:37.587 に答える
2

すべてのクラスが共通の GraphBase 抽象クラスから継承されるようにします。共通のプロパティをこのクラスに抽象化してから、派生クラスでオーバーライドします。

于 2013-10-02T08:54:15.420 に答える
1

インターフェイスは既に提案されているため、別の代替手段を提供するために、共通のプロパティ/メソッドを共有するだけでなく、共通の実装も共有するため、基本クラスを使用できます。

public abstract class Graph
{
   #region Private Members

   private string m_baseDir = "";
   private string m_imageFile = m_graphName + Utils.ImageExtension;

   #endregion Private Members

   #region Properties

   public string BaseDir
   {
       set { m_baseDir = value; }
   }
   public string GraphName
   {
       get { return m_graphName; }
   }

   public abstract string ImageFile { get; }

   #endregion Properties

   #region Constructor


   public HandTrackingGraphs(string baseDir)
   {
       m_baseDir = baseDir;
   }

   #endregion Constructor
}

public class GraphOne : Graph
{
    public override string ImageFile { get { return "GraphOne"; } }
}

public class GraphTwo : Graph
{
    public override string ImageFile { get { return "GraphTwo"; } }
}

public class GraphThree : Graph
{
    public override string ImageFile { get { return "GraphThree"; } }
}

その後、あなたの使用法は

List<Graph> listOfGraphs = new List<Graph>();
listOfGraphs.Add(new GraphOne());
listOfGraphs.Add(new GraphTwo());
listOfGraphs.Add(new GraphThree());

foreach (IGraph currentGraph in listOfGraphs)
{
    string imageFile = currentGraph.ImageFile;
}
于 2013-10-02T08:57:27.443 に答える
0

この場合、必要なのは戦略パターン を実装することだけです。いくつかのアイデアを得るには、このコードを参照してください

abstract class AbsGraph
{
    public string ImageFile { get; protected set; }
    //other properties

    public abstract void DrawGraph();
    //other methods

    public void CommonMethod()
    { }
    //other common method
}

class Graph1 : AbsGraph
{
    public override void DrawGraph()
    {
        //do graph specific task
    }
}

class Graph2 : AbsGraph
{
    public override void DrawGraph()
    {
        //do graph specific task
    }
}

class Graph3 : AbsGraph
{
    public override void DrawGraph()
    {
        //do graph specific task
    }
}

今、あなたはすることができます

var absGraphs = new List<AbsGraph>
                    {
                        new Graph1(),
                        new Graph2(),
                        new Graph3()
                    };
foreach (var graph in absGraphs)
{
    graph.DrawGraph();
}
于 2013-10-02T09:00:54.427 に答える