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

您当前没有实现该接口。您不能使用静态方法来实现接口。您必须使用实例方法。当然,您可以在实现中调用静态方法,但那是另一回事。

听起来不MessageBox应该InstanceGenerator 派生 - 我建议它应该组成它:

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 回答