2016-11-22 3 views
0

NHMountainGoatのおかげで答えが得られました! インタフェースを実装するのが良い選択肢に見えるので、「必要な」メソッドのみがインスタンス化されています。 それは次のようになります。 EDITc#他のクラスメソッドを使用

class Machine 
{ 
    //REM: MachineConnexion is a link to the main server where asking the data 
    internal linkToPLC LinkToPLC; 
    public IlinkToPLC ILinkPLC; 
    public interface IlinkToPLC//Interface to linkPLC 
    { 
     Int16 MachineNumIS { get; set; } 
    } 
    internal class linkToPLC : IlinkToPLC 
    { 
     private Int16 Act_MachineNum; 
     private List<string> genlnkPLCCanvas; 
     private List<string> genlnkPLCworkingwith; 
     static private List<string> ListSymbolNoExist; 
     private string[] ListToPLClnk = { 
          "GlobalFolder.PMachine[{0}].", 
          "GlobalFolder.PMachine[{0}].STATE.", 
          "GlobalFolder.Machine[{0}].", 
          "GlobalFolder.Machine[{0}].STATE.", 
         }; 
     public linkToPLC()//ctor 
     { 
      genlnkPLCCanvas = new List<string>(ListToPLClnk); 
      genlnkPLCworkingwith = new List<string>(ListToPLClnk); 
      ListSymbolNoExist = new List<string>(); 
      Act_MachineNum = MachineNumIS; 
     } 
     public Int16 MachineNumIS { get { return (Int16)ReadWriteMachine("data"); } set { ReadWriteMachine("data", value); } } 
     public string ValueExist(string ValueToreach, bool WorkingDATA = false) 
     { 
      if (!WorkingDATA) 
      { 
       for (int inc = 0; inc < genlnkPLCworkingwith.Count; inc++) 
       { 
        string StrValueToReach = genlnkPLCworkingwith[inc] + ValueToreach; 
        if (MachineConnexion.SymbolExists(StrValueToReach)) 
        { 
         ListSymbolNoExist.Clear(); 
         return StrValueToReach; 
        } 
        else ListSymbolNoExist.Add(genlnkPLCworkingwith[inc] + ValueToreach); 
       } 
      } 
      else if (WorkingDATA) 
      { 
       string StrValueToReach = genlnkPLCworkingwith[10] + ValueToreach; 
       if (MachineConnexion.SymbolExists(StrValueToReach)) 
       { 
        ListSymbolNoExist.Clear(); 
        return StrValueToReach; 
       } 
       else ListSymbolNoExist.Add(genlnkPLCworkingwith[10] + ValueToreach); 
      } 
      if (ListSymbolNoExist.Count != 0) 
      { 
       string ErrorList = ""; 
       for (int inc = 0; inc < ListSymbolNoExist.Count; inc++) 
       { 
        ErrorList = string.Concat(ErrorList + "Num: " + inc.ToString() + " " + ListSymbolNoExist[inc].ToString() + "\n"); 
       } 
       Console.WriteLine("Error" + ErrorList); 
      } 
      return null; 
     } 
     public object ReadWriteMachine(string VariableName, object DataToWrite = null, bool WorkingDATA = false) 
     { 
      string valueToFind = ""; 
      if (ValueExist(VariableName) != "FALSE") 
      { 
       if (DataToWrite != null) { MachineConnexion.WriteSymbol(valueToFind, DataToWrite); } 
       return MachineConnexion.ReadSymbol(valueToFind); 
      } 
      return VariableName; 
     } 
    } 
    public Machine()     //constructor 
    { 
     LinkToPLC = new linkToPLC(); 
    } 
} 

、それはラインで.....参照オブジェクトがオブジェクトのインスタンスに定義されていないことを私に言っては動作しません:マシン()LinkToPLC =新しいlinkToPLC();私はバグを見つけ// REMは、それは私だった; O))24112016

// REM 24112016

これら二つの概念の主な違いは何ですか:静的インスタンスおよびインターフェイスは?

例:

class Program 
{ 
    static void Main(string[] args) 
    { 
     ITestInterface InterInstance = new TestInterface(); 
     //test Interface 
     bool value1 = true; 
     value1 = InterInstance.invert(value1); 
     InterInstance.print(value1); 
     //test Instance static 
     TestStaticInstance staticInstance = new TestStaticInstance(); 
     staticInstance.Instance.invert(value1); 
     staticInstance.Instance.print(value1); 
     Console.ReadKey(); 
    } 
} 
class TestInterface : ITestInterface 
{ 
    public bool invert(bool value) 
    { 
     return !value; 
    } 
    public void print(bool value) 
    { 
    Console.WriteLine(value.ToString()+"\n"); 
    } 
    private void methodX() 
    { } 
} 
interface ITestInterface 
{ 
    bool invert(bool value); 
    void print(bool value); 
} 
public class TestStaticInstance 
{ 
    public TestStaticInstance Instance; 
    public TestStaticInstance() 
    { 
     Instance = this; 
    } 
    internal bool invert(bool value) 
    { 
     return !value; 
    } 
    internal void print(bool value) 
    { 
     Console.WriteLine(value.ToString()); 
    } 
} 

おかげ

+3

継承はコードの再利用のためのツールとは考えないでください。継承は "is-a"関係を意味します - もし 'otherstuff'が' linktoPLC'なら継承が適切かもしれません。それが単にPLCに含まれていれば、構成は正しい選択かもしれません。 –

+0

_copies_はありません。 - 'needanotherone'を含む' linktoPLC'の各インスタンスは、独自の 'genlnkPLCworkingwith'コレクションを持っています。 'List fleas'コレクションを持つ基本クラス' Animal'を考えてみましょう。それぞれのDogと各Catは独自のノミのコレクションを持ち、myDog.Scratch()はコレクションからノミを除去することしかできません。それを静的にするとコレクションは一度しか存在しませんが、達成しようとしていることを正確にはわかりません。 –

+0

あなたの質問をもう一度読んでください私は混乱しています - 'needanotherone'と' LinkToPLC'が 'genlnkPLCworkingwith'で参照されるリストを共有しているかどうか尋ねていますか?それに対する答えは「いいえ」です。 'virtual'と' override'について質問しているので、あなたがやろうとしていることが分かりません。 'virtual'と' override'は_data_ではなく_methods_に当てはまります。 –

答えて

1

あなたはリンククラスのインスタンスを取るために、あなたの他のクラスを構築することはできますか?参照:

/// <summary> 
/// just a stub to demonstrate the model 
/// </summary> 
internal class Machine 
{ 
    public string ReadData() { return "this is data"; } 
    public void WriteData(string data) { Console.WriteLine(data); } 
} 

internal interface IMachineDataAccessor 
{ 
    string Read(); 
    void Write(string data); 
} 

class LinkClass : IMachineDataAccessor 
{ 
    protected Machine _machine; 

    public LinkClass(Machine machine) 
    { 
     _machine = machine; 
    } 

    public void DoMyWork() 
    { 
     // insert work somewhere in here. 

     string dataFromMachine = Read(); 

     Write("outbound data"); 
    } 

    public string Read() 
    { 
     return _machine.ReadData(); 
    } 

    public void Write(string data) 
    { 
     _machine.WriteData(data); 
    } 
} 

class PersistentClass 
{ 
    IMachineDataAccessor _machineImpl; 

    public PersistentClass(IMachineDataAccessor machineAccessImplementation) 
    { 
     _machineImpl = machineAccessImplementation; 
    } 

    public void DoMyWork() 
    { 
     string dataFromMachine = _machineImpl.Read(); 

     // insert work here. Or anywhere, actually.. 

     _machineImpl.Write("outbound data"); 
    } 
} 

class StateClass 
{ 
    IMachineDataAccessor _machineImpl; 

    public StateClass(IMachineDataAccessor machineAccessImplementation) 
    { 
     _machineImpl = machineAccessImplementation; 
    } 

    public void DoMyWork() 
    { 
     string dataFromMachine = _machineImpl.Read(); 

     // insert work here. Or anywhere, actually.. 

     _machineImpl.Write("outbound data"); 
    } 
} 

static void Main(string[] args) 
{ 
    LinkClass link = new LinkClass(new Machine()); 
    PersistentClass persistent = new PersistentClass(link as IMachineDataAccessor); 
    StateClass state = new StateClass(link as IMachineDataAccessor); 

    persistent.DoMyWork(); 
    state.DoMyWork(); 
    link.DoMyWork(); 
} 
+0

Jablonovo、答えとして私の応答をマークできますか?私は評判のポイントが必要です。また、コードを再構成することを間違いなく期待していましたが、PersistenceクラスとStateクラスでLinkClassの新しいインスタンスを作成していることがわかりました。そのインスタンスを1つのインスタンスにすることが重要だと思っていました。コンストラクタで参照を取得します。この方法では、1つのインスタンスしか作成および共有できません。あなたはクラスとインスタンスの違いについてはっきりしていますか? – NHMountainGoat

+0

完了。私はクラスがオブジェクトのキャンバスに似ていて、インスタンスはオブジェクトが床から上がって魂、名前、それができるかどうかを賞賛するものであることは間違いないと思います。リンククラスはマシンの一部であるため、アクセスする必要がありましたが、すべてにアクセスする必要はありませんでした。これらのインターフェースインスタンスは、私がインターフェースに入れたメソッドだけを実装していますか?または、それはすべてのことをinstanciatingですが、参照されるメソッドへのアクセスのみを許可しますか?ご協力いただきありがとうございます。 – Jablonovo

+0

2番目の質問は正しい - クラス全体がインスタンス化されますが、インターフェース(インターフェースのメソッド)のみが他のコンシューマーに利用可能になります。インタフェースは、この用途をはるかに超える大きな利点を提供します.BTW。 – NHMountainGoat

関連する問題