类互相调用问题如何解决

yzx99 2013-09-12 11:51:53
加精
大家是否有遇到过这样的问题:
比如我有10个类的源码,某个类A,有一个其它小工具经常用到的好方法,于是我把它添加到小工具源码中(一般我用“添加为链接”),但A代码有调用到类B,于是我又把B链接过来。接着一编译,B又有调用到C、D,我再加,C又调到E、F……这样,我又是基本上把我整个类源码加到我一个小工具中了。
大家是如何解决?

我猜想的一些方案,但都不满意:
一、生成DLL,工具引用DLL(本来就是小工具,就像小巧一些,不想带一个1-2M的DLL)
二、把源码整理好一些,分层次或分类,但我不知道这里面有什么好原则,我也是分层了,但结果就形成一层调一层。
...全文
6222 125 打赏 收藏 转发到动态 举报
写回复
用AI写文章
125 条回复
切换为时间正序
请发表友善的回复…
发表回复
瘦又美 2013-10-01
  • 打赏
  • 举报
回复
公西雒 2013-09-30
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
我们把这个程序再变一变:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class A
    {
        public void foo1(Func<Action<Action>> action)
        {
            action()(foo2);
        }
        public void foo2()
        {
            //...
        }
    }
    class B
    {
        public void foo(Action action)
        {
            //...
            action();
            //...
        }

    }
    class C
    {
        public void foo() { new A().foo1(() => x => new B().foo(x)); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new C().foo();
        }
    }
}
我们把对A、B的依赖关系转移到C中,此时A依赖C,而C依赖AB,AB之间相互独立。 此时程序就分层了。主程序一层,C一层,AB一层。 能在脑海中想象下层关系么?我就不画UML图了。 实际上,使用委托只是为了简化这个例子,实际上我们应该用接口,这也就是IoC或者依赖注入框架做的事情了。
版主好强大!
zhuangyi1 2013-09-30
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
我们能不能让A和B双向都不依赖呢?也是可以的。我们把依赖关系放在主程序中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class A
    {
        public void foo1(Func<Action<Action>> action)
        {
            action()(foo2);
        }
        public void foo2()
        {
            //...
        }
    }
    class B
    {
        public void foo(Action action)
        {
            //...
            action();
            //...
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();
            a.foo1(() => x => b.foo(x));
        }
    }
}
注意看,主程序需要知道AB,但是A和B都不需要知道对方。 我们和最初的版本比下,在这个版本中主程序知道A,而A需要知道B,而B有需要知道A:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class A
    {
        public void foo1()
        {
            new B().foo();
        }
        public void foo2()
        {
            //...
        }
    }
    class B
    {
        public void foo()
        {
            //...
            new A().foo2();
            //...
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            new A().foo1();
        }
    }
}
为什么上面的那个程序我敲进去提示有错?菜鸟求指导, 报错处分别为: 1.foo1(Func<Action<Action>> action) 2.foo(Action action):提示需要一个类型参数 3.a.foo1(() => x => b.foo(x));
YHL27 2013-09-22
  • 打赏
  • 举报
回复
llsshh1985 2013-09-22
  • 打赏
  • 举报
回复
值得收藏,赞版主
zouyx317 2013-09-18
  • 打赏
  • 举报
回复
C#学习中... 关注
jack_leiwin 2013-09-17
  • 打赏
  • 举报
回复
这个......!
a19895161989516 2013-09-17
  • 打赏
  • 举报
回复
楼主 去看看大话设计模式
ktei2008 2013-09-17
  • 打赏
  • 举报
回复
引用 39 楼 microtry 的回复:
[quote=引用 5 楼 caozhy 的回复:] ......实际上我们应该用接口,这也就是IoC或者依赖注入框架做的事情了
从你提供的代码来看,这不是IOC,你只是转移了依赖,这种依赖没有消除(或者说没有把组合推迟到运行时刻),
引用 18 楼 ktei2008 的回复:
这个帖子可以加精,我估计很多人不知道这些东西。
还有人说要加精,这是误导别人[/quote] Yeah.... blah blah... you're so verbose
风中_之云 2013-09-16
  • 打赏
  • 举报
回复
你猜.我也在找答案
hongwuyu 2013-09-16
  • 打赏
  • 举报
回复
不错,用得到
blackkettle 2013-09-16
  • 打赏
  • 举报
回复
xintianandxintian 2013-09-16
  • 打赏
  • 举报
回复
好东西啊,值得收藏
phoenixlbw 2013-09-16
  • 打赏
  • 举报
回复
恩,楼主经验借鉴了
灬豆豆灬 2013-09-16
  • 打赏
  • 举报
回复
飘过,走过,路过
gcx110 2013-09-16
  • 打赏
  • 举报
回复
说胡话 这个还真的不太好说 不能草率的决定啊
勉励前行 2013-09-16
  • 打赏
  • 举报
回复
问题域求解的过程往往就是一个类体系设计过程,我们设计一个个内聚的类,他们相互组合继承,能解决问题域所延伸的各种问题,这个过程就是建立问题域求解模型,叫建模。模型一般不要建立在反射的基础上,反射该是边缘应用,是一个有益的补充,能解决强类型系统难以解决的问题。
勉励前行 2013-09-16
  • 打赏
  • 举报
回复
多个类的源码,因为这些类都是“别人”写的,如果各个类之间的引用与预定义有冲突时怎么办, 楼主的要求,用插件方式比较通用些。 要增加一个功能,就增加一条插槽,然后将实现类动态注入该插槽中。应用就成了面向插槽(接口)的应用了。这样也不需要反射。插槽间是充分隔离的,也就不怕引用多少个类,也不怕不同厂商间的相互不兼容代码,如同名,预定义宏(编译开关)不一样等问题。
偶买噶的 2013-09-16
  • 打赏
  • 举报
回复
哈哈,学习,学习,在学习!
瘦又美 2013-09-16
  • 打赏
  • 举报
回复
加载更多回复(33)

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧