首页 新闻 会员 周边

根据不同的接口实现不同的实现类,这要怎么弄?

0
悬赏园豆:100 [已解决问题] 解决于 2014-03-12 08:57

现在是,定义了一组接口,在不同的类里实现了接口中的方法,现在我想通过一个 工厂或者说是一种方式,在调用的时候,直通过传入接口,返回接口的实现对象。 我设计模式了解的比较少,也不够扎实,请大家给点思路最好有代码,或者说哪个设计模式比较接近也可以,谢谢!

感觉应该是没说明白,补点代码!

 

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var user = Factory<IUser>.Create();
            user.Login("username", "password");
            var mail = Factory<IMail>.Create();
            mail.SendMail("内容", "标题", "地址");
        }
    }

    public class Factory<T>
    {
        public static T Create()
        {
            //就是这里
            return default(T);
        }
    }

    public interface IUser
    {
        bool Login(string username, string pass);
    }

    public interface IMail
    {
        bool SendMail(string content, string title, string touser);
    }

    public class UserImp : IUser
    {

        public bool Login(string username, string pass)
        {
            throw new NotImplementedException();
        }
    }

    public class MailImp : IMail
    {
        public bool SendMail(string content, string title, string touser)
        {
            throw new NotImplementedException();
        }
    }
}

 

 

在注释的地方怎么写,具体写什么,或者说用其他方式,而不是现在的样子。

最终想要的是,在前台调用的时候,只希望看到接口和帮助接口实例化对象的类,而不出现具体子类对象。

醉低调的主页 醉低调 | 初学一级 | 园豆:128
提问于:2014-03-11 15:31
< >
分享
最佳答案
0

传入接口 怎么说

收获园豆:80
Yu | 专家六级 |园豆:12980 | 2014-03-11 16:34

补充了一些内容。

醉低调 | 园豆:128 (初学一级) | 2014-03-11 16:49

@醉低调: 

 

bool reslut=typeof(T).IsAssignableFrom(typeof(UserImp));可以用这个判断一下,true的话就返回

Yu | 园豆:12980 (专家六级) | 2014-03-11 16:57

@Yu: 这样需要写好多个判断吧??

醉低调 | 园豆:128 (初学一级) | 2014-03-11 17:02

@醉低调: 可以用反射

Yu | 园豆:12980 (专家六级) | 2014-03-11 17:03

@Yu: 刚你写的代码提醒了我,也想到了反射,不过具体怎么写??刚找了一堆反射的资料看的头疼,还是不知道怎么动态创建这个对象,求帮助啊。

醉低调 | 园豆:128 (初学一级) | 2014-03-11 17:12

@醉低调: 伪代码

 

var type = typeof(Test);
            type.Assembly.CreateInstance(type.FullName) as T

程小王 | 园豆:106 (初学一级) | 2014-03-11 18:04

@醉低调:

 public class Factory<T> where T : class
    {
        public static T Create()
        {
            Assembly assembly = Assembly.LoadFrom(@"target.dll"); // 加载同一程序集的EXE 或 DLL 

            foreach (Type t in assembly.GetTypes())
            {
                if (t.GetInterface(typeof(T).Name) != null)
                {
                    return System.Activator.CreateInstance(t) as T;
                }
            }

            return null;
        }
    }

 

Yu | 园豆:12980 (专家六级) | 2014-03-11 20:15
其他回答(1)
0

这个可以参考下Ioc的相关资料。

收获园豆:20
幻天芒 | 园豆:37175 (高人七级) | 2014-03-11 23:31

谢谢,已经找到了一些关于IOC的资料,问题基本解决。

支持(0) 反对(0) 醉低调 | 园豆:128 (初学一级) | 2014-03-12 08:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册