2017-10-17 18 views
0

私はデコレータパターンを適用して、L337メソッドのように、ワードを特定の暗号化に暗号化するオブジェクトを作成しようとしています。 。基本的には、入力フィールドに単語を入力し、テキストオブジェクトに暗号化された単語を表示したいと思います。しかし、私はL337デコレータをメインのデコレータクラスから継承することはできません。それはキーワード 'super'を受け入れないので、基本単語を試しましたが、Encryptを実装すると、オブジェクトnewEncryptionは使用されません。このパターンを一緒に置く方法を見つけ出すのに助けてくれますか?デコレータパターンを使用したユニファイド暗号化文字列

私は基本的にデコレータパターンが何であるか知っています。オブジェクトを作成し、基本的なデコレータを作成し、特定のデコレータを作成し、オブジェクトをデコレートして排他的なメソッドや機能をインスタンス化します。

public class Encryption : MonoBehaviour 
{ 

public static InputField inputBox; 
public static Text outputText; 



public interface IEncryption { void Encrypt(); } 


public class TextEncryption : IEncryption 
{ 
    public void Encrypt() 
    { 
     string currentText = inputBox.text; 
     outputText.text = currentText; 
    } 
} 


public abstract class encryptionDecorator : IEncryption 
{ 
    protected IEncryption tempEncryption; 
    public encryptionDecorator(IEncryption newEncryption) 
    { 
     tempEncryption = newEncryption; 
    } 

    public void Encrypt() 
    { 
     tempEncryption.Encrypt(); 
    } 
} 

public class L337EncryptionDecorator : encryptionDecorator 
{ 
    public L337EncryptionDecorator(IEncryption newEncryption) : base(newEncryption) 
    { 
     print("Encrypting L337 Code"); 
    } 

    public void Encrypt() 
    { 

    } 

} 

}

答えて

0

私はあなたが実際にtempEncryptionを使用したいと思いますが、あなたは本当にdidntのあなたがそう推測イムnewEncryptionを使用することができませんでしたどこ伝えます。

しかし、とにかく、これでいくつかのことがクリアされることを願っています。あなたのコードからわずかに編集されているので、GUIのものを置く必要はありませんでしたが、単なるCnPにすることはできます。

using UnityEngine; 

public class Encryption : MonoBehaviour { 

    public interface IEncryption { 
     void Encrypt(); 
    } 

    public class TextEncryption : IEncryption { 
     public void Encrypt() { 
     } 
    } 

    public abstract class EncryptionDecorator : IEncryption { 

     protected IEncryption tempEncryption; 

     public EncryptionDecorator(IEncryption newEncryption) { 

      //this will be called when you override the constructor 
      Debug.Log("In EncryptionDecorator constructor: " + newEncryption.GetType()); 
      tempEncryption = newEncryption; 
     } 

     //if you are going to override a method in a child class, 
     //declare it either abstract ("no body; passes implementation to child") or 
     //virtual ("allows for a base implementation") 
     public virtual void Encrypt() { 

      Debug.Log("In EncryptionDecorator.Encrypt(): " + tempEncryption.GetType()); 
      tempEncryption.Encrypt(); 
     } 
    } 

    public class L337EncryptionDecorator : EncryptionDecorator { 

     public L337EncryptionDecorator(IEncryption newEncryption) : base(newEncryption) { 

      //newEncryption is a parameter, think of it as sort of a local variable. 
      //but since you pass it down to the parent class, it gets assigned to tempEncryption 
      //the base-class constructor is called first! 
      Debug.Log("In L337EncryptionDecorator constructor: " + newEncryption.GetType()); 
     } 

     //this overrides the base implementation. you can call it with 
     //base.Encrypt() though. 
     public override void Encrypt() { 
      //you have no parameters here, but you could use the inherited variable tempEncryption because you declared it protected 
      Debug.Log("In L337EncrytionDecorator.Encrypt(): " + tempEncryption.GetType()); 

      //base refers to the base class 
      base.Encrypt(); 
     } 

    } 

    void Start() { 

     IEncryption encryption = new L337EncryptionDecorator(new TextEncryption()); 

     encryption.Encrypt(); 

    } 
} 

多分私はこれについてすべてが恋しくなっていますか?

関連する問題