限制对继承属性的访问C#

时间:2009-05-20 14:18:00

标签: c# inheritance

让我说我继承了一个类,它有几个公共属性和/或方法,但是我不希望它们是我的类的公共属性/方法 - 换句话说,我想让这些属性保护我的属性类。

这可以实现吗?

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

修改

是的,谢谢大家的答案,但我认为我不够清楚。我想要完成的是:

我编写了一个扩展ListView控件的Windows控件。 ListView有一个公共集合Items,可以修改。这一切都很好,但是由于我需要额外的数据,我编写了将项目添加到listview的新方法。

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

由于我们希望在不同的项目中多次重复使用此控件,我们担心迟早会使用将项目添加到Items集合的默认方式(实际上只是时间问题)。我们只是在寻找一种方法来防止这种情况发生,例如当Items集合变大时抛出异常,但是它的用途是什么。

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

5 个答案:

答案 0 :(得分: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(); }    
    }

}

答案 1 :(得分:4)

继承就是说“你可以像使用基类一样使用这个派生类,它提供了专门的行为。”

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

答案 2 :(得分: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; }
    }
}

答案 3 :(得分:1)

你不能通过继承来做到这一点。这实际上就是继承的内容。 是一种关系无法减少界面。派生类必须是基类的完整表示。

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

答案 4 :(得分:0)

我没有使用AOP(也许是PostSharp)来放置你不想使用的属性,然后你可以用你的方面以适当的方式处理它。