【问题标题】:Is there a way to implicitly reference an object in a has-a relationship without explicitly using the object name?有没有一种方法可以在不显式使用对象名称的情况下隐式引用具有关系的对象?
【发布时间】:2019-05-21 11:42:02
【问题描述】:

我想“隐式”使用包含的对象作为别名,就像它是“this”关系一样。 C# 是否支持这样的东西,或者哪种设计模式可能最接近表达的意图?我正在考虑的替代方法是定义一个委托并在 MyHasA 类中实现它。

伪例子A

 public class MyClass
    {
    public MyHasA hasA;

    public void MyMethod()
    {
      implicit(hasA)->
     {
       Print("Hello World"); // vs hasA.Print("Hello World") 

     }
    }
  }

伪例子B

 public class MyClass
    {
    public MyHasA hasA;
    using implicit hasA;
    public void MyMethod()
    {
       Print("Hello World"); // vs hasA.Print("Hello World")          
     }
    }
  }

【问题讨论】:

  • 我不知道有任何此类机制。但是你为什么要这样做呢?您希望解决什么问题?
  • 这有点像XY Problem。您能否解释一下您实际上想要实现的目标(而不是您尝试实现目标的方式),可能会有不同的方式。
  • 实际上,这在我看来是一种反模式。那会让代码真的很混乱。
  • 或者你的意思是这样的:stackoverflow.com/q/7692826/982149? (静态导入)
  • @CurtisWhite C# 有内部类,它们确实可以访问外部类的功能。我怀疑那是你想要的。你还没有解释你想做什么,只是你认为它可以怎么做。为什么不使用通用的方式来实现例如带有接口和/或泛型类型的状态?

标签: c# design-patterns


【解决方案1】:

这个问题与 has-a 关系变量的范围有关。典型的解决方案是从基类派生并使用隐式 this 引用。当由于无法访问的实例化逻辑或有大量代码不想在语法上进行更改(即“myObject.DoSomething”与“DoSomething”的形式)而无法从基类派生时,就会出现此问题。

推荐的解决方案是内部类和部分类。部分类允许创建逻辑包含。最终解决方案涉及在外部类中创建一个带有委托/事件处理程序的部分类,并在内部类中将其初始化为外部类中的方法。部分类和委托的组合提供了一层逻辑包含,同时仍然保留了面向对象设计的大部分优点。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/partial-method https://ninjatrader.com/support/forum/forum/ninjatrader-8/strategy-development/102514-strategy-inheritance-in-nt8

【讨论】:

  • 看起来您可能已经找到了答案,这很好,但完全不清楚这与问题有何关系或它解决了什么问题。这意味着任何人都很难判断您的答案是否合适,或者不同的方法是否会有所帮助。这包括看到问题和答案的未来用户。
  • @ScottHannen 我想这是关于范围 * 代码重用的问题。最初的问题基本上是假设当您无法从中派生时,您想在语法上将范围限定为“is-a”关系。它只是一个句法。但是我询问的结构将解决的问题是,您可以将大块代码从“is-a”关系移动到“has-a”关系,而无需使用句法引用。最接近的是 LINQ。所提出的解决方案是将“is-a”类拆分为逻辑文件单元“部分类”。我选择了内部类和部分类的组合。
  • 也许一个代码示例会有所帮助,以及它如何使事情变得更好的示例。
  • @ScottHannen 假设您有很多代码——如果将其移动到“has-a”关系,那么您必须添加语法前缀对象引用。如果我们可以限定“this”引用以避免打字,那就太好了。我想到了一种解决方法。您必须将无法派生或不起作用的基类克隆到具有相同方法的代理中,然后在代理中引用该对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2013-11-05
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多