我目前只是通过通用界面公开属性,例如
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();
这是我想要的行为。
然而,我只是想知道这是否是正确的方法?或者,如果有更好的方法?
答案 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)
你的例子似乎包含了利用遗产的一个不好的例子。既然你包含了一个属性,它就无法想出一个更好的例子,我猜它是真的。我建议在这种情况下忘记基类并将属性粘贴在派生的上。