C# 隐藏基类或接口以防污染代码

C# 隐藏基类或接口以防污染代码,c#,C#,这是我无数次面临的问题。。考虑… [public/private] interface IBase { void DoCore(); } public interface IDerived_A : IBase { void Do_A(); } public interface IDerived_B : IBase { void Do_B(); } 这里我有两个有用的接口,它们提供了IBase接口提供的一些常见功能,以及它们各自独有的一些其他功能。。c强制我将IBase

这是我无数次面临的问题。。考虑…

[public/private] interface IBase
{
    void DoCore();
}

public interface IDerived_A : IBase
{
    void Do_A();
}
public interface IDerived_B : IBase
{
    void Do_B();
}
这里我有两个有用的接口,它们提供了IBase接口提供的一些常见功能,以及它们各自独有的一些其他功能。。c强制我将IBase声明为公共的,与继承接口具有相同的可见性。。但是,IBase接口对每个人都是可见的。。其他任何人都不需要使用此接口。。ppl只需要访问IDeriver_X接口。。如何对代码的用户隐藏IBase接口?我的代码可以有两种类型的用户

同一命名空间/程序集中的代码访问IDerived_X。。 引用包含IDeriver_X.的程序集的单独项目中的代码。。 附言。。我讨厌公开更多的接口,因为这意味着只有那些ppl将直接使用的接口。。 ps2。。我在课堂上也面临同样的困境

编辑:

我觉得这个问题有点被误解了。。对此,我将发布一个澄清。。这个问题不仅仅与接口有关。。上课的事也让我烦。。考虑下面的代码…

public abstract class Vehicle
{
    // generic vehicle functionality
}
public Car : Vehicle
{
    // functionality specific to cars
}
public Truck : Vehicle
{
    // functionality specific to trucks
}
汽车和卡车是我唯一允许代码用户使用的两种对象。。为了使我的工作更容易,避免代码重复,我将通用代码移到了Vehicle抽象类中。。但这并不意味着用户可以在车辆变量中存储对汽车或卡车的引用。。从用户的角度来看,我的代码应该只公开汽车和卡车,而不是汽车或引擎,或者我在内部使用的任何基类,以避免代码重复。。具体地说,我在寻找一种技术,使我能够暴露完整的汽车和卡车,但不暴露任何其他不完整的积木,如车辆或发动机。。问题是,如果派生类是公共的,c不允许我将基类设为私有。。这更有意义吗=

或者,您的子接口是从基接口派生的,这是有意义的 或子接口的用户不应访问基接口的API 在第一种情况下,API IDerived_A的消费者有权访问IBase是合理的。 在第二种情况下,不要从基础IBase中删除

任何其他的东西,都是粗花呢

作为您界面的消费者,我同时拥有IBase和IDerived_a,因此我有权访问IBase

或者,您的子接口是从基接口派生的,这是有意义的 或子接口的用户不应访问基接口的API 在第一种情况下,API IDerived_A的消费者有权访问IBase是合理的。 在第二种情况下,不要从基础IBase中删除

任何其他的东西,都是粗花呢


作为您界面的消费者,我同时拥有IBase和Iderive_a,因此我有权访问IBase是合理的,我不确定您在这里试图表达什么,因此可能需要对您的完整场景进行描述。 如果您的iDrived_A和iDrived_B接口是IBASE,则您的客户端代码需要能够访问DoCore。让IBase public可以让您概括在继承IDerived_A或IDerived_B的类型上同样有效的功能

如果您只是想避免在IDerived_A和I_Derived_B中重复方法定义,但从IBase继承不是建模A是一种关系,即I_Derived_A和I_Derived_B不需要在层次结构中直接相关,而只是在它们之间共享一些功能,那么您可能只需要与它们创建单独的接口它们之间没有层次关系,如下所示:

public interface ICore 
{
    void DoCore()
}

public interface INonCore_A // no more inheritance
{
    void Do_A();
}

public interface INonCore_B 
{
    void Do_B();
}
现在可以请求库代码中的类来实现ICore和INonCore_A/B。ICore本身可能仍然需要是公共的,除非您希望DoCore方法本身仅对库代码可见,但您可以通过使用ICore的显式接口实现在类中隐藏它

在第二种情况下,您失去的是一种告诉客户机代码实现INonCore_a要求您也实现ICore的方法。 例如,该功能存在于scala编程语言中,但不存在于C中。如果存在,您可以说:

// warning: non-existing c# syntax. Does not compile
    public interface INonCore_A {
        self: ICore => // this is scala syntax, does not work in c#
                       // it means "anyone who implements INonCore_A must 
                       // also implement ICore
            void Do_A();
    }

如前所述,由于这在c语言中不起作用,因此要确保实现INonCore_A和B的人也实现了ICore,这取决于文档和程序员的纪律,我不确定您想在这里表达什么,所以可能需要对您的完整场景进行描述。 如果您的iDrived_A和iDrived_B接口是IBASE,则您的客户端代码需要能够访问DoCore。让IBase public可以让您概括在继承IDerived_A或IDerived_B的类型上同样有效的功能

如果您只是想避免重复IDerived_A和I_派生的_B中的方法定义,但IBase的继承不是建模,那么A是一种关系,即I_派生的_A和 I_派生的I_B不需要在层次结构中直接相关,但只是在它们之间共享一些功能。您可能只需要创建单独的接口,它们之间没有层次关系,如下所示:

public interface ICore 
{
    void DoCore()
}

public interface INonCore_A // no more inheritance
{
    void Do_A();
}

public interface INonCore_B 
{
    void Do_B();
}
现在可以请求库代码中的类来实现ICore和INonCore_A/B。ICore本身可能仍然需要是公共的,除非您希望DoCore方法本身仅对库代码可见,但您可以通过使用ICore的显式接口实现在类中隐藏它

在第二种情况下,您失去的是一种告诉客户机代码实现INonCore_a要求您也实现ICore的方法。 例如,该功能存在于scala编程语言中,但不存在于C中。如果存在,您可以说:

// warning: non-existing c# syntax. Does not compile
    public interface INonCore_A {
        self: ICore => // this is scala syntax, does not work in c#
                       // it means "anyone who implements INonCore_A must 
                       // also implement ICore
            void Do_A();
    }


如前所述,由于这在c中不起作用,因此要确保实现INonCore_A和B的人也实现ICore,这取决于文档和程序员的纪律。如果iDrive_A和iDrive_B被设计为公共的,那么将其基本接口IBase公开有什么害处?这些接口的实现者也需要实现IBase。为什么人们不直接使用IBase?如果没有人需要使用IBase,那么思想驱动的C将永远不存在。在这种情况下,为什么不直接使用IDerived_A和IDerived_B,例如重载一个方法以接受其中一个?我不会那么做,但如果你一定要让伊巴斯出现…@Jon。。是的,这就是重点。。除非是我自己创造的,否则创意永远不会存在。。用户不会创建任何新的派生。。她只会使用我提供的东西。。是的,我可以删除IBase并将其功能/字段复制到iDrived_A和B。。但它复制了代码。。如果我们谈论的是类而不是接口,情况就更糟了。。为什么c迫使我向代码用户透露我用来创建特定类的类?是的,我可以使用封装而不是继承来隐藏内部接口/类,但它仍然强制代码的重复。。写入无效的DoSomething{InnerObj.DoSomething;}在每一个封装类/接口中..我想知道是否有一种方法,我可以只在继承层下公开一个特定的类/接口,而不向用户公开所有的父接口/类..如果IDerived_a和IDerived_B被设计为公共的,那么让它们的基本接口IBase有什么害处平民的这些接口的实现者也需要实现IBase。为什么人们不直接使用IBase?如果没有人需要使用IBase,那么思想驱动的C将永远不存在。在这种情况下,为什么不直接使用IDerived_A和IDerived_B,例如重载一个方法以接受其中一个?我不会那么做,但如果你一定要让伊巴斯出现…@Jon。。是的,这就是重点。。除非是我自己创造的,否则创意永远不会存在。。用户不会创建任何新的派生。。她只会使用我提供的东西。。是的,我可以删除IBase并将其功能/字段复制到iDrived_A和B。。但它复制了代码。。如果我们谈论的是类而不是接口,情况就更糟了。。为什么c迫使我向代码用户透露我用来创建特定类的类?是的,我可以使用封装而不是继承来隐藏内部接口/类,但它仍然强制代码的重复。。在每一个封装类/接口中写入void DoSomething{InnerObj.DoSomething;}。我想知道是否有一种方法可以只在继承层下公开一个特定的类/接口,而不向用户公开所有的父接口/类。您没有“提供IBase和IDerived_a”,您必须实现IDerived_合同中的所有方法。如果您还可以访问IBase,您可以潜在地避免这种情况。我想这就是OP的问题所在。一旦IDerived_A从IBase中删除,我就可以访问所有IBase属性和方法。这就是OOP的原理!考虑您正在执行控件层次结构。然后其他开发人员将创建从基本接口/类派生的新控件。但您希望它们从大多数派生接口实现所有方法,但它们可能会错误地从一个基本接口派生。所以他们避免了一些重要方法的实现,这在OOP中得到了很好的解决。不要从IBase派生您理想的接口。只需分别实现IDerved和IBase。没有继承权。然后,与Java相比,您甚至可以从C中的显式实现中获益,但如果您不希望我访问基础,则不要从任何东西中派生!是的,这是该场景的选项之一。但它会产生代码重复;您没有“同时获得IBase和iDrived_A”,您必须实现iDrived_A合同中的所有方法。如果你
您还可以访问IBase-您可以潜在地避免这种情况。我想这就是OP的问题所在。一旦IDerived_A从IBase中删除,我就可以访问所有IBase属性和方法。这就是OOP的原理!考虑您正在执行控件层次结构。然后其他开发人员将创建从基本接口/类派生的新控件。但您希望它们从大多数派生接口实现所有方法,但它们可能会错误地从一个基本接口派生。所以他们避免了一些重要方法的实现,这在OOP中得到了很好的解决。不要从IBase派生您理想的接口。只需分别实现IDerved和IBase。没有继承权。然后,与Java相比,您甚至可以从C中的显式实现中获益,但如果您不希望我访问基础,则不要从任何东西中派生!是的,这是该场景的选项之一。但它会产生代码重复;