在不创建新实例的情况下执行对象方法

时间:2017-09-11 09:53:24

标签: object methods instance

如何在Print内执行TestObject

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?
}

1 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点:

直接将程序传递给TestObject

优点:

  • 简单的改变

缺点:

  • 您必须公开Print
  • 您将在Program
  • 中公开其他内容
  • 您直接将TestObjectProgram联系起来

以下是示例代码:

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
  • 仅向TestObject
  • 公开1个方法

缺点:

  • 耦合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();
    }
}

在Program中实现一个接口并将其传递给TestObject

优点:

  • 仅公开界面公开的内容
  • 更容易实现其他地方(更好地说“需要此接口”而不是“需要代表”,更清晰的合同规范)
  • 没有耦合到特定类型,耦合是满足特定条件的任何对象 - 实现接口

缺点:

  • 无相关(在我看来)

以下是示例代码:

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();
    }
}

结论:我的建议是选择界面方式。更清晰的设计,更容易扩展而无需传递多个代表。