使用Interface进行数据隐藏

时间:2010-12-05 10:11:48

标签: oop encapsulation

我有一个接口我有两个方法func A和func B和一个C类接口的实现,我有两个用户U1和U2。 我想要这样的功能,以便如果u1访问类C,则应调用func A,如果u2访问类C,则应调用func B. 我如何使用OOP实现这一点?

3 个答案:

答案 0 :(得分:1)

我认为你真正想要的是:

  1. 一个只有一个方法的接口
  2. 以不同方式实现它的2个类:func A和func B
  3. 将该用户作为参数的接口的工厂
  4. 实施例

    让我们说:

    1. U1是Barney,U2是Fred。
    2. func A正在打印“我爱你贝蒂”
    3. func B正在打印“我的俱乐部Wilma在哪里?!”
    4. interface Quote使用方法emitQuote()
    5. 定义
    6. C和D类将分别用A和B实现I
    7. 定义工厂(工厂类或工厂方法无关紧要)并将用户开关放在那里。
    8. 通过这种方式你可以打电话:

      Quote q = myFactory.getQuoteFor(u);
      q.emitQuote();
      

      这是纯粹的OOP,我认为以TDD方式编写非常简单。

答案 1 :(得分:0)

我会专注于你问的话。为什么你想要这样做,以及它是否真的是一个关于面向对象设计原则的好主意是另一个问题。

首先,您的要求类似于以下内容: (注释)

interface I
{
    void A();
    void B();
}

// class C : I { ... }

现在,让我们为用户1和用户2创建一个User角色和两个实现:

public interface User
{
    void Access(I x);
}

class User1 : User
{
    public void Access(I x)  {  x.A();  }
}

class User2 : User
{
    public void Access(I x)  {  x.B();  }
}

最后,按如下方式实例化您的用户1和2:

User u1 = new User1();
User u2 = new User2();

并按如下方式“访问”您的C:

I c = new C();
u1.Access(c);    // will call c.A()
u2.Access(c);    // will call c.B()

请注意,此代码几乎完全将类C排除在游戏之外,而是专注于界面(I)。但是,如果您希望代码专门与C一起使用,只需在适当的位置将I替换为C(即使用方法Access的参数)。


(注意:) 我为示例选择了C#,但转换为您选择的语言应该很容易。

答案 2 :(得分:0)

确切地需要更多的澄清来确定你想要做什么,但是......

不是在User类中使用逻辑,而是像OO一样,可能是工厂,如:

abstract class C : I
{
  public void A() { }
  public void B() { }
  public abstract void CallMethod();
}

class C1 : C
{
  public override void CallMethod() { A(); }
}

class C2 : C
{
  public override void CallMethod() { B(); }
}

static class Factory
{
  public static I GetI(User user) 
  {
    // This is where your if blocks will go, 
    // and it will return either a new C1 or a new C2
  }
}

这样做的好处是允许用户保持简单,不包含任何业务代码。工厂必须足够聪明才能知道它想要根据用户创建哪个C.所有调用真实方法的实际工作都是在C本身完成的。

编辑:您可能需要稍微调整接口和C类 - 在这种情况下,您需要将CallMethod()方法放在接口中。或者你的工厂可以返回C而不是I。当然,在不知道整个故事的情况下,很难说哪个是正确的。