【问题标题】:Hiding methods from other classes when inheriting from a class and Interface or Abstract class从类和接口或抽象类继承时隐藏其他类的方法
【发布时间】:2015-06-23 16:12:23
【问题描述】:

为了改进进一步的实施并提供一些指导方针并在项目中尽可能保持通用性,我创建了一个接口,其中包含一些应该使用的方法。但是,调用该类的用户应该只能看到此类的一种方法,因此我希望它们属于受保护的种类。例如

public class ClassThree
{
    public ClassThree()
    {
        var classOne = new ClassOne();
        class1.MethodOne();
    }
}

尽管 ClassOne 有 4 个方法,但 3 个方法仅在一个公共类中使用,因此是私有的或受保护的。然而,这 3 种方法是使第 4 种方法起作用所必需的(在理想情况下,其他开发人员会遵循相同的原则)。所以我不想在智能感知上看到以下弹出:

class1.MethodTwo();
class1.MethodThree();
class1.MethodFour();

我知道可以从接口隐式调用方法,例如

IInterface.MethodTwo<Type,Type>(string name)
{
  //Do stuff here
}

但是,我想在 ClassOne 本身中调用所述方法时阻止所有强制转换,因为这只是我眼中的一根刺。我喜欢我的代码干净,这对我来说根本不干净。我想到了一个抽象类,但是我的类是从另一个类继承的。有了界面我就可以做

public ClassOne : ClassTwo, IInterface<Type1,Type2>

当我使用抽象类执行此操作时,Visual Studio 说需要一个接口。任何见解都非常受欢迎和赞赏,因为我希望通过让我和必须使用我的代码的其他开发人员的生活更轻松来提升我的代码。

提前致谢!

编辑:场景是可以有几个类,如 ClassOne,它们基本上做同样的事情,但是它们使用不同的类型,因为它们必须返回的对象持有不同的值。然而,这些对象的构建或多或少是相同的,例如:

  1. 收集所有 API 数据
  2. 检索要导出到 API 的列表并根据类型调用 #3 或 #4。
  3. 将类型 1 导出到 API
  4. 将类型 2 导出到 API

想法总是相同的,但自然不同的 API 需要不同的变量。但是为了确保像以前一样遵循所有步骤,我想实现一个接口或其他东西,但步骤 1,2 和 3 应该是私有的或受保护的,并且只有步骤 2 应该可用于使用它的类。但是,如果我只将方法 2 放在接口中,我永远无法确定其他人会实现 1,3 和 4。这就是这里的目标:P。而 ClassOne 也继承自另一个类,而不仅仅是接口。

编辑 2:我知道接口只提供公共方法,这就是为什么我正在寻找替代品,因此这个问题。我知道它有什么问题,我只是不知道如何才能按照我想要的方式得到它。感谢到目前为止的回复!

编辑3:界面目前看起来像这样,我只是为了举例调整了变量名。

   public interface IExport<in T, in TU>
    {
        void GetRequiredApiData();

        bool MethodOne(List<Type> list);

        bool ExportOne(T one);

        bool ExportTwo(TU two);

        bool ValidateExport();
    }

【问题讨论】:

  • 有点难以理解你在说什么。您在第一段中谈论的是一个界面,但这不知何故变成了一个类中间句。这个类(我猜是ClassOne)有一些你想隐藏在消费代码中的方法。您能否详细说明为什么将成员设为私有或受保护不起作用?另外,ClassThree 是什么?那是消费代码吗?
  • 添加了额外的解释,希望现在更清楚!
  • 接口中的所有方法都是公共的,根据设计,您只能从 1 个类继承数据(即使它是抽象的)。希望对你有帮助
  • @darkndream 我可以使用任何可能的替代方案吗?所有逻辑都在那里。调用类时只有这 3 种方法引起了我的注意
  • 我会预先避免这种设计,因为重构主要由复制粘贴样板组成的 85 个对象确实很困难。但是,要完成您想要的工作,不要使用此对象来完成所有工作,而是在此对象上保留一个公共方法,并让它调用您创建的另一个对象上的 4 个方法,该对象利用抽象类来定义受保护的方法.

标签: c# interface logic abstract-class object-oriented-analysis


【解决方案1】:

其他三个方法应该只在您的公共方法中调用,或者将您的第一个方法设为私有/受保护并在一个公共方法中调用所有 4 个方法。

接口的全部意义在于准确隐藏对您有问题的东西——调用者不需要知道的其他三种方法。

我怀疑您需要在单独的特定时间以特定顺序调用这三个方法。如果是这种情况,那么您有代码气味。这些方法可能只是具有副作用并更改全局状态的无效子例程。代码需要重构,不只是一系列子例程,对象需要以不同的方式分解。

【讨论】:

  • 在我的课堂上,我有一些属性是对象列表。这些由Get类(继承)中的类方法填充第一个方法。这个 Get 类调用静态 Request 类,该类包含通用方法来进行 API 调用,同时提供所需的类型等。然后我可以使用这些值来查看它们是否在我的目标 API 中实际可用,否则会发生错误的请求。一旦这些验证通过,我就可以将所述对象导出到 API。有什么办法可以改进这个逻辑?
  • 将您需要的类型参数放在方法上,而不是对象本身。这样你就可以保持你的继承结构而不需要类型参数的干预。
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2014-10-09
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多