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

C# 如何使用类作为基,但公开隐藏类类型?,c#,C#,我目前只是通过一个通用接口公开属性,例如 public interface IBaseClass { int ID { get; set; } } internal class MyBaseClass : IBaseClass { public MyBaseClass() { } public int ID { get; set; } } public class MyExposedClass : IBaseClass { private MyBaseClas

我目前只是通过一个通用接口公开属性,例如

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();
这是我想要的行为


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

如果您只想防止实例化,那么可以将
MyBaseClass
抽象化(使它的构造函数也受到保护-这是一个很好的设计),并从中派生
MyExposedClass
。如果您想完全隐藏类型,您的方法似乎很好。

如果您只想防止实例化,您可以将
MyBaseClass
抽象化(使它的构造函数也受到保护-这是一个很好的设计)并从中派生
MyExposedClass
。如果您想完全隐藏类型,您的方法似乎很好。

将基类抽象。

将基类抽象。

这对我来说很好。制作小型接口使编写解耦代码变得更容易。

我觉得这很好。制作小型接口使编写解耦代码变得更容易。

我不知道这是否有帮助,但您可以将基类设置为受内部保护的。这意味着任何内部类都可以像访问公共类一样访问它,或者任何类(从程序集内部和外部)都可以对基类进行子类化。但它不会阻止人们实现自己的子类


或者,我认为通过接口公开是最好的方法。

我不知道这是否有帮助,但您可以将基类设置为内部受保护。这意味着任何内部类都可以像访问公共类一样访问它,或者任何类(从程序集内部和外部)都可以对基类进行子类化。但它不会阻止人们实现自己的子类


或者,我认为通过接口公开是最好的方式。

为此,您可以选择如下显式实现:

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; }
    }
}

您可以参考类似的帖子,您可以选择这样的显式实现:

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; }
    }
}

您可以参考类似的帖子

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


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

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


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

您的示例似乎包含了一个利用继承性的糟糕示例。由于您只包含一个属性,因此无法提供更好的示例,我猜它是真实的。在这种情况下,我建议忘记基类,将属性粘贴到派生类上。

您的示例似乎包含了一个利用继承的糟糕示例。由于您只包含一个属性,因此无法提供更好的示例,我猜它是真实的。在这种情况下,我建议忘记基类,并将属性粘贴到派生类上。

该死,太晚了-+1不利于速度@Darin:理想情况下,我希望完全隐藏类型,尽管我从未考虑过抽象方法。这样,每次我想模仿类的派生时,就不用做所有的setter/getter了+1.该死,太晚了-速度+1@Darin:理想情况下,我希望完全隐藏类型,尽管我从未考虑过抽象方法。这样,每次我想模仿类的派生时,就不用做所有的setter/getter了+1.更好的方法是什么?你应该更好地解释你的意图。@Danvil:做我的问题的更好方法……做什么的更好方法?你应该更好地解释你的意图。@Danvil:更好地解决我的问题…@Kangkan:在我的情况下,即使我创建了
MyExposedClass
本身的实例,我仍然希望能够访问这些属性。所以隐式对我来说是好的,但是对于这个建议+1(正如我在使用显式的例子中看到的那样)@Kangkan:在我的情况下,我希望即使我创建了
MyExposedClass
本身的实例,也能访问这些属性。所以隐式对我来说是很好的,但是对于这个建议+1(正如我从我使用的显式示例中看到的)@mP:这个示例就是……一个示例!问题的关键在于设计。这就是我问它的原因,我想知道是否有一种方法可以从中派生出一个基类型