2010-04-30 38 views
1

我目前只是通过通用接口公开属性,例如如何使用类作为基础,但公开地隐藏类的类型?

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

更好的方法来做什么?你应该更好地解释你的意图。 – Danvil 2010-04-30 08:49:25

+0

@Danvil:一个更好的方式来做我的问题要求... – James 2010-04-30 08:50:50

回答

6

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

+0

织补,太迟了 - 速度+1! – 2010-04-30 08:47:27

+0

@Darin:理想情况下,我想尽量隐藏类型,虽然我从来没有真正考虑过抽象的方法。每当我想模仿课堂派生时,我就不必再去做所有的设置者和获得者了。 +1! – James 2010-04-30 08:48:14

0

使您的基类抽象。

1

这看起来不错。制作小接口可以更容易地编写解耦代码。

1

我不知道这是否会有所帮助,但是您可以让您的基类受到内部保护。这意味着任何内部类都可以访问它,就好像它是公共的,或者任何类(从内部和外部都可以)都可以继承基类。它不会阻止人们实施自己的子课程。

另外,通过接口暴露将是我想的最好的方式。

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

+0

@Kangkan:在我的情况下,即使我自己创建了一个MyExposedClass实例,我仍想访问属性。所以对于我的建议,隐含的对我来说可能是正确的(尽管我可以从我明确使用的示例中看到) – James 2010-04-30 08:54:25

0

,可以将该接口为public,实现一个类的内部密封实现,并使用工厂方法来构建所需接口的实例。那样的话,客户端永远不会知道什么时候你改变了你的实现,或者你有多个工厂插入的同一个基本接口的实现。你也可以消除接口中的set访问器,并将它们放在内部实现中,只将属性暴露给外部世界。这样外部代码必须对你的实现做出更少的假设,并且你更好地被隔离。请纠正我,如果我有这种方法的糟糕/不好的形象。

编辑:工厂将公开,您需要某种“传输对象”将数据传递到工厂。该传输对象实现将与其接口一起公开。

0

你的例子似乎包括利用继承的一个不好的例子。既然你包括一个单一的财产,它不能拿出一个更好的例子,我猜它是真实的。我会建议在这种情况下忘记基类,并坚持派生的属性。

+0

@mP:示例正是这样的一个示例!它的设计对于这个问题很重要。这就是我问它的原因,我想知道是否有一种可以从中派生出来的基本类型,但保持隐藏的特定类型。从我所看到的方法来看,我的方法基本上就是做到这一点的唯一方法(例如通过接口公开它)。 – James 2010-04-30 09:11:35