Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制对继承属性C的访问#_C#_Inheritance - Fatal编程技术网

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

C# 限制对继承属性C的访问#,c#,inheritance,C#,Inheritance,假设我继承了一个类,该类具有多个公共属性和/或方法,但是我不希望它们成为我的类的公共属性/方法-换句话说,我希望使这些属性成为我的类的受保护属性 这能实现吗 我希望我已经够清楚了,如果没有请让我知道,我会尽量更好地解释我自己 编辑: 好的,谢谢大家的回答,不过我觉得我不够清楚。我试图做到的是: 我编写了一个扩展ListView控件的windows控件。ListView有一个可以修改的公共集合项。这很好,但是由于需要额外的数据,我编写了向listview添加项的新方法 到目前为止一切都很好,但是I

假设我继承了一个类,该类具有多个公共属性和/或方法,但是我不希望它们成为我的类的公共属性/方法-换句话说,我希望使这些属性成为我的类的受保护属性

这能实现吗

我希望我已经够清楚了,如果没有请让我知道,我会尽量更好地解释我自己

编辑:

好的,谢谢大家的回答,不过我觉得我不够清楚。我试图做到的是:

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

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

由于我们希望在不同的项目中多次重用此控件,因此我们担心迟早会使用向items集合添加项的默认方式(实际上只是时间问题)。我们只是在寻找一种防止这种情况发生的方法,比如在Items集合变得更大时抛出异常,但这是我们想要的方式


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

你不能通过继承来做到这一点。这实际上就是继承的意义所在。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中重新实现如此多的内容才能让它成为现实