2

私はマルチプラットフォームのことをやっていますが、OOPはあまり得意ではありません。現在、私のコードは次のとおりです。

    public interface IMessageBox {
        void Show(string Text);
        void Show(string Text, string Description, MessageBoxType Type);
        MessageBoxResult ShowYesNo(string Text, string Description, MessageBoxType Type);
        MessageBoxResult ShowYesNoCancel(string Text, string Description, MessageBoxType Type);
    }

    public class MessageBox : InstanceGenerator {
        public static void Show(string Text) {
            MessageBoxImpl.Show(Text);
        }

        public static void Show(string Text, string Description, MessageBoxType Type) {
            MessageBoxImpl.Show(Text, Description, Type);
        }
        public static MessageBoxResult ShowYesNo(string Text, string Description, MessageBoxType Type) {
            return MessageBoxImpl.ShowYesNo(Text, Description, Type);
        }
        public static MessageBoxResult ShowYesNoCancel(string Text, string Description, MessageBoxType Type) {
            return MessageBoxImpl.ShowYesNoCancel(Text, Description, Type);
        }
    }

protected class InstanceGenerator {
        public static IMessageBox MessageBoxImpl = null;
        public static IWindow WindowImpl = null;

        private static Assembly Instance = null;
        private static string InstanceName = null;

        private static Assembly LoadAssembly(string lib) {
            string AppPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            Assembly assembly = Assembly.LoadFile(Path.Combine(AppPath, lib + ".dll"));
            return assembly;
        }

        private static object CreateInstance(string @class) {
            Type type = Instance.GetType(InstanceName + "." + @class);
            return Activator.CreateInstance(type);
        }

        private static object CreateInstanceFromPath(string lib, string @class) {
            string AppPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            Assembly assembly = Assembly.LoadFile(Path.Combine(AppPath, lib + ".dll"));
            Type type = assembly.GetType(lib + "." + @class);
            return Activator.CreateInstance(type);
        }


        /// <summary>
        /// Inits the whole thing
        /// </summary>
        public static void Init() {
            if (CurrentOS.IsWindows)
                InstanceName = "Lib.Windows";
            else if (CurrentOS.IsMac)
                InstanceName = "Lib.MacOS";
            else if (CurrentOS.IsLinux)
                InstanceName = "Lib.Linux";
            else // no implementation for other OSes
                throw new Exception("No implementation of Lib for this OS");

            Instance = LoadAssembly(InstanceName);

            // initialize the classes
            MessageBoxImpl = (IMessageBox) CreateInstance("MessageBox");
        }
    }

編集:

InstanceGeneratorは、アセンブリからロードされたIMessageBoxのインスタンスを返します。インスタンスを作成/接続するためのより良い方法はありますか?すべて同じ静的メソッドを実装することは、まったく良い解決策ではないように見えます。それらのインターフェースをクラスでラップするより自動的な方法はありますか、それとも私は何か間違ったことをしていますか?

4

2 に答える 2

4

現在、インターフェースを実装していません。静的メソッドを使用してインターフェイスを実装することはできません。インスタンスメソッドを使用する必要があります。もちろん、実装内で静的メソッドを呼び出すことはできますが、それは別の問題です。

InstanceGeneratorから派生するMessageBox必要があるようには思えません-それを作成することをお勧めします:

public class MessageBox : IMessageBox {

    private readonly InstanceGenerator generator;

    public MessageBox(InstanceGenerator generator) {
        this.generator = generator;
    }

    public static void Show(string Text) {
        generator.MessageBoxImpl.Show(Text);
    }

    public static void Show(string text, string description, MessageBoxType type) {
        generator.MessageBoxImpl.Show(text, description, type);
    }

    public static MessageBoxResult ShowYesNo(string text, string description, 
                                             MessageBoxType type) {
        return generator.MessageBoxImpl.ShowYesNo(text, description, type);
    }

    public static MessageBoxResult ShowYesNoCancel(string text,
                                                   string description,
                                                   MessageBoxType type) {
        return generator.MessageBoxImpl.ShowYesNoCancel(text, description, type);
    }
}

そうでなければ、これはすべてかなり無意味なので、まだ実装MessageBoxImplいないと思います...IMessageBox

于 2012-04-04T19:10:09.153 に答える
1

現状の実装は、実際には何もしないインターフェースを定義しています。インターフェイスのポイントは、次のようなコードを記述できるようにすることです。

instance_implementing_interface.DoSomething();

あなたはそれを持っていません。代わりに、インターフェイスを定義してから、静的メソッドを使用してすべてを書き換えます。インターフェースの考え方は、インスタンスを使用してその仕事をしたいものは何でも、そのインターフェースを実装する任意のインスタンスを取得でき、それが言うことを実行することを信頼できるということです(自分で自分自身に嘘をつく習慣がない限り) API)。

実際、上記の文章を書いたとき、私はあなたが実際よりも混乱していると思っていたかもしれないことを理解しています. あなたが持っているコードを書いた理由について、私は困惑しています。で意図的に静的メソッドを記述した理由を説明していただけますMessageBoxか?

于 2012-04-04T19:16:58.537 に答える