2009-05-20 64 views
1

可以说我继承了一个类,它有几个公共属性和/或方法,但是我不希望它们成为我的类的公共属性/方法 - 换句话说,我想使这些属性保护了我班的属性。限制对继承属性的访问C#

这可以实现吗?

我希望我已经够清楚了,如果不是请让我知道,我会更好地解释自己。

编辑:

吧,谢谢所有的答案,但是我不认为我是很清晰。我试图完成的是:

我写了一个扩展ListView控件的Windows控件。 ListView有一个公共集合项,即可以修改。这很好,但是我写了新的方法来添加项目到ListView,因为我需要额外的数据。

到目前为止,这一切都很好,但是Items集合仍然可以被任何东西修改,这是一个问题,因为如果通过Items集合的直接操作添加一个项目,并不是我需要的所有数据都会被收集,错误。

因为我们希望在不同的项目中多次重复使用这个控件,所以我们担心迟早会使用向Items集合添加项目的默认方式(仅仅是时间问题)。我们正在寻找一种方法来防止这种情况的发生,比如当Items collection变大时抛出一个异常,但这是它的打算方式。

我希望现在这一切都有意义。

回答

4

永远不要说永远。这可能不是最好的主意,但它似乎对我有用。这通过在子类中重新实现它隐藏项目,然后使用属性隐藏项目。我添加了一个“CustomExposedItems”属性,以便您可以看到现有项目在底层ListView中仍可访问。

public partial class CustomListView : ListView 
{ 
    public CustomListView() 
    { 
     InitializeComponent(); 
    } 

    public System.Windows.Forms.ListView.ListViewItemCollection CustomExposedItems 
    { 
     get 
     { 
      return base.Items; 
     } 

    } 

    [EditorBrowsable(EditorBrowsableState.Never)]  
    [Browsable(false)]  
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    [Obsolete("Use the new custom way of adding items xyz")] 
    public new System.Windows.Forms.ListView.ListViewItemCollection Items  
    { 
     get { throw new NotSupportedException(); }  
    } 

} 
+0

+1;仍然可以通过铸造来访问原始项目。但是我认为,如果不使用包含ListView的UserControl(这会导致更糟糕的问题需要解决),那么这是最好的选择。 – mmmmmmmm 2009-05-20 15:46:56

1

你不能通过继承来做到这一点。这实际上是继承关系。一个是一个关系不能减少接口。派生类必须是基类的完整表示。

将您的继承变为参考。通过调用它来重用“基类”的实现。 (组合而不是继承)如果您需要多态,请添加通用接口或将公共部分移动到单独的抽象基类中。

3

不,你不能那样做。你可以做的最好的事情就是创建一个类并包装从它派生的基类 - 但是这当然会破坏继承。 (我假设你不能修改的基类。如果可以的话,你应该重新考虑设计,因为它看起来像你的新类不应该从基类派生。)

class BaseClass 
{ 
    public String IWantThis { get; set; } 
    public String IDoNotWantThis { get; set; } 
} 

class MyClass 
{ 
    private BaseClass baseClass = new BaseClass(); 

    public String IWantThis 
    { 
     get { return this.baseClass.IWantThis; } 
     set { this.baseClass.IWantThis = value; } 
    } 
} 
4

继承是所有关于说:“你可以以与您可以使用基类相同的方式使用此派生类,并提供专门的行为。“

如果您的不能以与基类相同的方式使用派生类,那么您不应该使用继承:您打破了Liskov's Substitutability Principle。在这种情况下,使用组合而不是继承。 (就我个人而言,我不会使用类到类的继承,反正更喜欢构图 - 我发现专业化方面确实没有问题的案例相对较少,但当确实做到了时,它很棒!)

+0

与WinForms控件和组成问题(含在这种情况下,一个ListView用户控件)是,你必须重新实现了这么多东西,在你的用户控件让它表现得像一个ListView。 因此,在这里使用构图是非常不直接的。 – mmmmmmmm 2009-05-20 15:49:52

0

我不使用AOP(也许是PostSharp)来放置您不想使用的属性,然后您可以以某种适合您的方面的方式处理它。