当前位置: 首页 > 知识库问答 >
问题:

C#调用作为接口传递的对象的内部方法

白彦
2023-03-14

我有一个定义一些函数的接口IFoo,一个实现IFoo和一些内部函数的抽象类FooBase,还有几个从FooBase派生的类Foo。
我还有一个类Bar,它应该从FooBase调用一个方法,但是它的参数作为IFoo传递。所以所有的东西都是这样的:

public interface IFoo
{
  // Some methods
}

public abstract class FooBase : IFoo
{
  // Methods from IFoo

  internal TInternalType SomeMethod();
}

public class Foo1 : FooBase
{
  // ...
}

public class Bar
{
  public void DoSomething(IFoo foo)
  {
    // This does not feel right:
    TInternalType myT = (foo as FooBase).SomeMethod();
  }
}

如前所述,这感觉不对,因为任何人都可能会出现,编写一个实现IFoo的类Baz并用它调用DoSomething将会失败。

我还发现了这个问题/解决了一个类似的问题,这个问题是关于公共接口的内部材料的,但这并不能改变实现IFoo的某些第三方类会导致问题的问题,即我仍然有一个说谎的API。

或者,我可以更改DoSomething的类型,以获取FooBase类型的参数,并通过将构造函数设置为内部函数来保护第三方类的FooBase,但我希望在公共API中只有抽象,而不是实现。

背景:
我正在编写一个库,该库公开一些类型,并使用另一个库L实现其功能。使用L的事实是我想对库的用户隐藏的一个实现细节,所以当在某个时候由于某种原因我必须用其他东西替换L时,我的用户不会注意到。

我现在有了一些将向我的用户公开的Foo类,以及一个将与L一起工作的Bar类。对于每个类Foo,必须创建一个来自L的类的相应实例;但是单独的Foo类太不同了,它们都需要单独的逻辑来创建各自的L类。

这就是为什么我在FooBase中定义了一个内部抽象方法,每个Foo都实现了自己的方法来从L生成它的类,所以Bar可以只调用这个方法来获得它使用L所需要的东西。

也许有一种完全不同于内部重载方法的方法。

共有1个答案

程钧
2023-03-14

接口的全部意义在于显示实现的能力。如果您需要访问实现的内部成员,您应该让代码的使用者知道它们不是真正的内部成员(或者通过遵循这里的其他答案,或者例如通过接口隔离和只传递单个角色接口),或者让它们真正的内部成员。在您的情况下,我认为它应该封装在foobase类中。

我认为doSomething方法还对ifoo实现执行其他操作。无论bar如何处理从内部方法返回的内部类型,都可能发生在其他ifoo方法中的foobase中。这里的指导原则是告诉,不要问。

 类似资料:
  • 我试图在定义它的接口中调用一个事件(请参见下面的代码)。但是,我得到了以下错误:的左侧 我怀疑这可能与接口中声明的所有事件都始终是属性有关。这是一个bug、一个特性吗?有什么解决方法吗? 谢谢。

  • 我创建了一个接口,以便可以在对话和片段之间进行通信。 目标:当用户从对话框中选择任何内容时,应将其显示在文本视图中。 在这个界面中,我创建了一个界面方法,在主活动中调用,并传递用户在对话框中选择的值。与用户选择的值一起,在我的片段中,我创建了一个方法,将文本视图设置为该值。然而,每当我调用该方法时,它总是返回null。 我对日志进行了大量测试,发现通过我的方法传递的值不是空的,一切似乎都按照我想要

  • 问题内容: 我正在尝试为Android创建一个应用,并且遵循本教程http://developer.android.com/training/basics/firstapp/starting- activity.html 有一部分 然后我按照本教程操作,一切正常,直到我删除参数 我的问题就是为什么每次删除它时,功能就是: 然后我运行该应用程序,它被强制关闭。 谁能启发我?谢谢 问题答案: 方法(通

  • 我正在开发一个具有蓝牙功能的应用程序。我使用一个片段来扫描并列出蓝牙设备。单击时,会回调到提供所选蓝牙设备的主要活动。 我一开始使用的是Android 6(API 23)的智能手机,然后不得不调整代码以适应Android 5.0(API 21)的使用。 我只是将minSDK更改为API21并重新构建了项目,没有任何问题。 该应用程序在智能手机上运行时没有任何问题。安装了Android5的平板电脑运

  • 我是Android的新手,我正在开发一个应用程序,该应用程序试图连接服务器并获取Json响应,将其解析为类并使其可用。 为此,我上了三门课 公共类顾客{} 公共类ServerConnect{} 公共类JsonParser{} Serverconnect使用Volley库在异步线程上下载网页源代码。下载后,Server Connect类启动OnServerResponsed(String Respo