如何使用类作为基础,但是公开隐藏类类型?

时间:2010-04-30 08:43:41

标签: c#

我目前只是通过通用界面公开属性,例如

public interface IBaseClass
{
    int ID { get; set; }
}

internal class MyBaseClass : IBaseClass
{
    public MyBaseClass() { }
    public int ID { get; set; }
}

public class MyExposedClass : IBaseClass
{
    private MyBaseClass _base = new MyBaseClass();

    public int ID
    {
        get { return _base.ID; }
        set { _base.ID = value; }
    }
}

然后在我的主要应用程序中,我可以做到:

IBaseClass c = new MyExposedClass();
c.ID = 12345;

但不能这样做:

MyBaseClass b = new MyBaseClass();

这是我想要的行为。

然而,我只是想知道这是否是正确的方法?或者,如果有更好的方法?

7 个答案:

答案 0 :(得分:6)

如果你只是想阻止实例化,你可以使MyBaseClass抽象(使它的构造函数也受到保护 - 这是一个很好的设计)并从MyExposedClass派生出来。如果你想完全隐藏这种类型,你的方法就好了。

答案 1 :(得分:1)

这对我来说很好看。制作小型接口可以更容易地编写解耦代码。

答案 2 :(得分:1)

我不知道这是否会有所帮助,但您可以在内部保护您的基类。这意味着任何内部类都可以访问它,就像它是公共的一样,或者任何类(来自内部和没有程序集)都可以子类化基类。但它不会阻止人们实现他们自己的子类。

或者,通过界面进行曝光将是我认为最好的方式。

答案 3 :(得分:1)

为此你可以选择这样的显式实现:

public interface IBaseClass
{
    int ID { get; set; }
}

internal class MyBaseClass : IBaseClass
{
    public MyBaseClass() { }
    public int IBaseClass.ID { get; set; }
}

public class MyExposedClass : IBaseClass
{
    private MyBaseClass _base = new MyBaseClass();

    public int IBaseClass.ID
    {
        get { return _base.ID; }
        set { _base.ID = value; }
    }
}

您可以参考类似的帖子C# Interfaces. Implicit implementation versus Explicit implementation

答案 4 :(得分:0)

使您的基类抽象化。

答案 5 :(得分:0)

您可以将接口公开为public,实现该类的内部密封实现,并使用工厂方法构建所需接口的实例。这样,客户端永远不会知道您何时更改实现,或者您是否在工厂中插入了多个相同基本接口的实现。您还可以删除界面中的set访问器,并将它们放在内部实现中,以仅将属性公开给外部世界。这样,外部代码必须对您的实现做出较少的假设,并且您可以更好地隔离。如果我对这种方法有不好/不好的形象,请纠正我。

编辑:工厂将是公共的,您需要某种“传输对象”来将数据传递给工厂。传输对象实现将是公共的,以及它的接口。

答案 6 :(得分:0)

你的例子似乎包含了利用遗产的一个不好的例子。既然你包含了一个属性,它就无法想出一个更好的例子,我猜它是真的。我建议在这种情况下忘记基类并将属性粘贴在派生的上。