C# 限制对继承属性C的访问#
假设我继承了一个类,该类具有多个公共属性和/或方法,但是我不希望它们成为我的类的公共属性/方法-换句话说,我希望使这些属性成为我的类的受保护属性 这能实现吗 我希望我已经够清楚了,如果没有请让我知道,我会尽量更好地解释我自己 编辑: 好的,谢谢大家的回答,不过我觉得我不够清楚。我试图做到的是: 我编写了一个扩展ListView控件的windows控件。ListView有一个可以修改的公共集合项。这很好,但是由于需要额外的数据,我编写了向listview添加项的新方法 到目前为止一切都很好,但是Items集合仍然可以被任何东西修改,这是一个问题,因为如果通过直接操作Items集合添加了一个项,则不会收集我需要的所有数据,从而导致错误 由于我们希望在不同的项目中多次重用此控件,因此我们担心迟早会使用向items集合添加项的默认方式(实际上只是时间问题)。我们只是在寻找一种防止这种情况发生的方法,比如在Items集合变得更大时抛出异常,但这是我们想要的方式C# 限制对继承属性C的访问#,c#,inheritance,C#,Inheritance,假设我继承了一个类,该类具有多个公共属性和/或方法,但是我不希望它们成为我的类的公共属性/方法-换句话说,我希望使这些属性成为我的类的受保护属性 这能实现吗 我希望我已经够清楚了,如果没有请让我知道,我会尽量更好地解释我自己 编辑: 好的,谢谢大家的回答,不过我觉得我不够清楚。我试图做到的是: 我编写了一个扩展ListView控件的windows控件。ListView有一个可以修改的公共集合项。这很好,但是由于需要额外的数据,我编写了向listview添加项的新方法 到目前为止一切都很好,但是I
我希望这一切现在都有意义。你不能通过继承来做到这一点。这实际上就是继承的意义所在。is-a关系不能减少接口。派生类必须是基类的完整表示形式
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; }
}
}
将继承转换为引用。通过调用“基类”,可以重用“基类”的实现。(组合而不是继承。)如果需要多态性,请添加公共接口或将公共部分移动到单独的抽象基类中。继承无法做到这一点。这实际上就是继承的意义所在。is-a关系不能减少接口。派生类必须是基类的完整表示形式
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; }
}
}
将继承转换为引用。通过调用“基类”,可以重用“基类”的实现。(组合而不是继承。)如果需要多态性,请添加公共接口或将公共部分移动到单独的抽象基类中。不,您不能这样做。您所能做的最好的事情是创建一个类并包装基类,而不是从中派生——但这当然会破坏继承。(我假设您不能修改基类。如果可以,您应该重新考虑设计,因为看起来您的新类不应该派生自基类。)
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; }
}
}
不,你不能那样做。您所能做的最好的事情是创建一个类并包装基类,而不是从中派生——但这当然会破坏继承。(我假设您不能修改基类。如果可以,您应该重新考虑设计,因为看起来您的新类不应该派生自基类。)
继承就是说“您可以像使用基类一样使用这个派生类,并且它提供了专门的行为。”
如果不能以与基类相同的方式使用派生类,那么就不应该使用继承:这是在破坏继承。在这种情况下,使用组合而不是继承。(就我个人而言,我并不经常使用类到类的继承,我更喜欢组合——我发现很少有情况下,专门化方面真的可以毫无问题地工作。但是,当它工作时,它很好!)继承就是说您可以用与基类相同的方式使用此派生类,并且它提供了专门的行为
如果不能以与基类相同的方式使用派生类,那么就不应该使用继承:这是在破坏。在这种情况下,使用组合而不是继承。(就我个人而言,我并不经常使用类到类的继承,我更喜欢组合——我发现很少有情况下专门化方面真的可以毫无问题地工作。但当它工作时,它就很棒了!)我不使用AOP,可能是PostSharp,来处理你不想使用的属性,然后你可以用你的aspect以适当的方式处理它。我不使用AOP,可能是PostSharp,来处理你不想使用的属性,然后你可以用aspect以适当的方式处理它。永远不要说不。这s可能不是最好的主意,但对我来说似乎很管用。这会通过在子类中重新实现项来隐藏项,然后使用属性隐藏项。我添加了一个“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(); }
}
}
永远不要说永不。这可能不是最好的主意,但对我来说似乎很管用。这通过在子类中重新实现项目,然后使用属性隐藏项目来隐藏项目。我添加了一个“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、 通过强制转换仍然可以访问原始项目,但我认为这是不使用包含ListView的UserControl(这会导致更糟糕的问题需要解决)所能获得的最好结果.1;仍然可以通过强制转换访问原始项目。但我认为,不使用包含ListView的UserControl(这会导致更糟糕的问题需要解决)。WinForms控件和组合的问题(在本例中,UserControl包含ListView)您必须在UserControl中重新实现如此多的内容才能让它像ListView一样工作。因此,在这里使用组合是非常不实际的。WinForms控件和组合(在本例中UserControl包含ListView)的问题是,您必须在UserControl中重新实现如此多的内容才能让它成为现实