有没有一种方法可以隐式引用has-a关系中的对象而无需显式使用对象名称?

时间:2019-05-21 11:42:02

标签: c# design-patterns

我想“隐式”使用包含的对象作为别名,就像它是“ 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")          
     }
    }
  }

1 个答案:

答案 0 :(得分:0)

此问题与has-a关系变量的作用域有关。典型的解决方案是从基类派生并隐式使用此引用。当一个人由于无法访问的实例化逻辑而无法从基类派生或具有大量不需要对其进行语法更改的代码(即“ 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