执行对象方法而无需制作新实例



如何从 TestObject中执行 Print

class Program
{
    private int Value;
    static void Main()
    {
        TestObject test = new TestObject();
        Program p1 = new Program();
        Program p2 = new Program();
        p1.Value = 1;
        p2.Value = 2;
        p1.Print();
        p2.Print();
    } 
    private void Print()
    {
        Console.Write(Value.ToString());
        Console.ReadKey();
    }
}
class TestObject
{
    // How to execute p1.Print here?
}

有多种方法:

直接通过程序

专利:

  • 简单的更改

cons:

  • 您将必须公开Print
  • 您将在程序中公开其他事物
  • 您将TestObject耦合到Program直接

以下是示例代码:

class Program
{
    static void Main()
    {
        TestObject test = new TestObject(this);
    } 
    public void Print()
    {
        Console.Write(Value.ToString());
        Console.ReadKey();
    }
}
class TestObject
{
    public TestObject(Program p)
    {
        p.Print();
    }
}

将委托给testObject

专利:

  • 简单的更改
  • 不必公开Print
  • 仅将1方法公开到TestObject

cons:

  • 耦合是TestObject想要做某事,而不是TestObject想要访问做某事的事物

以下是示例代码:

class Program
{
    static void Main()
    {
        TestObject test = new TestObject(() => Print());
    } 
    private void Print()
    {
        Console.Write(Value.ToString());
        Console.ReadKey();
    }
}
class TestObject
{
    public TestObject(Action print)
    {
        print();
    }
}

在程序中实现接口并将其传递给testObject

专利:

  • 仅公开接口公开的内容
  • 更容易实现其他地方(最好说"需要此接口",而不是"需要代表",更清晰的合同规范)
  • 无耦合到特定类型,耦合是符合某些条件的任何对象 - 实现接口

cons:

  • 无相关的(我认为)

以下是示例代码:

interface IPrintable
{
    void Print();
}
class Program : IPrintable
{
    static void Main()
    {
        TestObject test = new TestObject(this);
    } 
    public void Print()
    {
        Console.Write(Value.ToString());
        Console.ReadKey();
    }
}
class TestObject
{
    public TestObject(IPrintable p)
    {
        p.Print();
    }
}

结论:我的建议是选择接口方式。更清晰的设计,易于扩展而不将多个代表传递到周围。

最新更新