2011-03-06 29 views
0

聚合优先于继承。继承可以知道父类。在聚集中,如何才能知道C#中的所有者?如何获得一个班级的“所有者”(不是父级),当它被聚合为另一个班级的成员时

如果我添加一个明确的引用,这是邪恶的父母,因为我会以另一种方式创建一个依赖关系,而编译器肯定知道父对象。除了创建这个引用之外,还有什么方法可以使用反射或其他的东西来破解。

如果所有者未知,Visual Studio如何构建调用堆栈? Visual Studio知道连接实例的所有链接,因此应该有办法做Visual Studio的工作?

+0

编译器不知道父级,运行时也没有。 – SLaks 2011-03-06 19:39:25

+0

确实它确实知道,因为孩子被连线为父母的成员。 – user310291 2011-03-06 19:41:36

+0

你错了。 .Net不会那样工作。如果你把同一个孩子放在两个父母身上呢? – SLaks 2011-03-06 19:46:10

回答

1

类没有办法知道其他类(或类)正在使用它,而不是直接使用它。

任何类别可能被许多其他人使用(总计) - 您如何确定哪些是所有者?

一般来说,这样的信息也不是真的有用(你最终会得到紧密耦合的代码,在所有者类型中全部包含switch语句),所以没有通用的机制来获取它。

+0

哦,这对我来说非常难过:(:)任何希望都没有确定? – user310291 2011-03-06 19:35:04

+1

@ user310291 - 你想达到什么目的?可能有设计解决方案,但没有实际的问题描述,不能提供。 – Oded 2011-03-06 19:36:10

+0

什么都没有具体我只是在想,正如我所说如果我想通过聚合来代替继承,那么我需要用owner属性替换父属性。 – user310291 2011-03-06 19:39:51

2

除非您将所有者的引用作为聚集类的成员添加,否则不能。

6

你不能,没有添加代码。哎呀,一个实例可以被“包含”几个不同的对象中:

IAuthenticator authenticator = new PasswordAuthenticator(); 
Foo foo = new Foo(authenticator); 
Bar bar = new Bar(authenticator); 

假设都foobar记得认证,其中哪些是单一PasswordAuthenticator实例的“主人”?

更重要的是,为什么你需要知道?如果您确定“子”对象知道关系的确有一个很好的设计原因,请为其添加适当的代码(可能是一个事件,如果根据您的需要明智的话)。但首先确定它是非常必要的。

+0

正如我所说,如果我想通过聚合取代继承,那么我需要用owner属性替换父属性。 – user310291 2011-03-06 19:39:14

+0

@ user310291:你声称你需要,但没有解释*为什么*你需要。你在“主人”身上想得到什么?如果不考虑整体设计,使用组合而不是继承,通常不是一个从一个切换到另一个的情况。 – 2011-03-06 19:41:22

+0

我需要出于同样的原因,在继承中,有时需要父属性,因为我告诉过你,我正在考虑用集合代替继承,并且我意识到我可能会遇到像这样的麻烦。 – user310291 2011-03-06 19:44:26

相关问题