让我说我继承了一个类,它有几个公共属性和/或方法,但是我不希望它们是我的类的公共属性/方法 - 换句话说,我想让这些属性保护我的属性类。
这可以实现吗?
我希望我足够清楚,如果不是,请让我知道,会更好地解释自己。
修改
是的,谢谢大家的答案,但我认为我不够清楚。我想要完成的是:
我编写了一个扩展ListView控件的Windows控件。 ListView有一个公共集合Items,可以修改。这一切都很好,但是由于我需要额外的数据,我编写了将项目添加到listview的新方法。
到目前为止一切都很好,但是Items集合仍然可以被任何东西修改,这是一个问题,因为如果通过直接操作Items集合添加项目,则不会收集我需要的所有数据,从而导致错误
由于我们希望在不同的项目中多次重复使用此控件,我们担心迟早会使用将项目添加到Items集合的默认方式(实际上只是时间问题)。我们只是在寻找一种方法来防止这种情况发生,例如当Items集合变大时抛出异常,但是它的用途是什么。
我希望现在这一切都有意义。
答案 0 :(得分:4)
继承就是说“你可以像使用基类一样使用这个派生类,它提供了专门的行为。”
如果你不能以与基类相同的方式使用派生类,那么你不应该使用继承:你正在打破Liskov's Substitutability Principle。在这种情况下,使用组合而不是继承。 (就我个人而言,我并没有那么多使用类到类的继承,更喜欢组合 - 我发现专业化方面确实有效且没有问题的情况相对较少。当它 工作时它很棒虽然!)
答案 1 :(得分: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(); }
}
}
答案 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)来放置你不想使用的属性,然后你可以用你的方面以适当的方式处理它。