2013-07-18 44 views
-2

看看这样的场景:B的这个实例是A实例的一个属性吗?

//base class 
abstract class AAA { } 

//class 1 
class BBB : AAA 
{ 
    //Field of ZZZ type 
    public ZZZ ZField = new ZZZ(); 
} 

//class 2 
class ZZZ 
{ 
     public string foo() { return ImAPropertyOfAnAAADerivedClass ? "yes" : "no"; } 

     bool ImAPropertyOfAnAAADerivedClass 
     { 
      get { /* here */ } 
     } 
} 

//running test 
new BBB().ZField.foo(); // => expected "yes" 
new ZField.foo(); // => expected "no" 

我的问题是:

是否有实现ImAPropertyOfAnAAADerivedClass的方法吗?

+3

'new ZField.foo();'我很确定这里有一个错误。 –

+0

这是不可能的,但你为什么需要它?如果你提供了你的实际问题,它可能以不同的方式解决。 –

+0

是的,它是新的ZZZ()。foo(); – Riera

回答

2

不是,它赢得了;可以在一个简单的方式。由于ZZZ与AAA没有直接关系。一种可能的方式是有来自ZZZ暴露的公共对象和BBB裁判传给它,然后检查为:

public class ZZZ 
{ 
    public string foo() { return ImAPropertyOfAnAAADerivedClass ? "yes" : "no"; } 

    bool ImAPropertyOfAnAAADerivedClass 
    { 
     get { return TestForAAA is AAA; } 
    } 

    public object TestForAAA { get; set; } 
} 

,同时使用这将通过BBB的参考对象。

当然这增加了依赖性,但工作!

+0

是的,我将不得不做这样的事情。我在反思,堆栈跟踪中发现,但直到现在都没有办法。 – Riera

1

。你不能这样做。首先,类型的实例永远不可能知道什么变量或字段引用了它们,因此您无法确定是否有任何BBB.ZField指向当前的ZZZ实例。

你可以得到的最接近的是这样的:

public class ZZZ 
{ 
    public string foo() { return ImAPropertyOfAnAAADerivedClass ? "yes" : "no"; } 
    protected bool virtual ImAPropertyOfAnAAADerivedClass 
    { 
     get { return false; } 
    } 
} 

class BBB : AAA 
{ 
    //Field of ZZZ type 
    public readonly ZZZ ZField = new BBB_ZZZ(); 

    private class BBB_ZZZ : ZZZ 
    { 
     protected override bool ImAPropertyOfAnAAADerivedClass 
     { 
      get { return true; } 
     } 
    } 
} 


new BBB().ZField.foo(); // "yes" 
new ZZZ().foo();  // "no" 

通知我做了场readonly,这意味着它不能在以后重新分配。这将确保ZField未设置为ZZZ的实例,foo将返回"no"

当然,没有什么从执行单独的子类,这将违反这些语义阻止你(或其他人):

private class Fake_ZZZ : ZZZ 
{ 
    protected override bool ImAPropertyOfAnAAADerivedClass 
    { 
     get { return true; } 
    } 
} 

new Fake_ZZZ().foo(); // "yes" 

在任何情况下,这些语义是笨拙的和。无论你试图用这种方法完成什么,都必须有更好的方式去实现它。我建议你完全重新考虑你的解决方案。

1

处理需要知道ZZZ实例的容器的最佳方法是将其注入到ZZZ的构造函数中。

public class ZZZ 
{ 
    public ZZZ(object owner = null) 
    { 
     this.owner = owner; 
    } 
    readonly object owner; 

    public bool ImAPropertyOfAnAAADerivedClass 
    { 
     get { return owner is AAA; } 
    } 
} 

然后,使您的包含类这项工作,改变BBB定义:

public class BBB : AAA 
{ 
    public BBB(){ 
     ZField = new ZZZ(this); 
    } 
    public readonly ZZZ ZField; 
} 

这种模式的dependency injection一个非常简单的例子,会给你你正在寻找的结果。

相关问题