C# 如何防止某些方法的继承?

C# 如何防止某些方法的继承?,c#,oop,class,inheritance,C#,Oop,Class,Inheritance,如何防止继承派生类中的某些方法或属性 public class BaseClass : Collection { //Some operations... //Should not let derived classes inherit 'Add' method. } public class DerivedClass : BaseClass { public void DoSomething(int Item)

如何防止继承派生类中的某些方法或属性


public class BaseClass : Collection   
{  
    //Some operations...  
    //Should not let derived classes inherit 'Add' method.  
}

public class DerivedClass : BaseClass      
{        
    public void DoSomething(int Item)      
    {      
        this.Add(Item); // Error: No such method should exist...      
    }      
}  

您不能,在这种情况下,继承对于作业来说是错误的工具。您的类需要将集合作为私有成员,然后您可以根据需要公开任意多或少的集合

您想要的模式是组合(“Has-a”),而不是继承(“is-a”)。基类应包含集合,而不是从集合继承。然后,基类可以选择在其接口上公开哪些方法或属性。其中大多数可能只是调用内部集合上等效方法的传递

在子类中将事物标记为私有不会起作用,因为任何具有基类型变量(
Collection x=new DerivedClass()
)的人仍然能够通过基类型访问“隐藏”成员


如果“Is-a”和“Has-a”不适合你,就从父母和朋友的角度来考虑吧。您不能选择您的父母,也不能将他们从您的DNA中删除,但您可以选择与谁关联。

尝试在派生类中隐藏类的公共成员通常是一件坏事(*)。试图隐藏它以确保它不会被调用更糟糕,而且通常无论如何都不会起作用

据我所知,没有任何标准化的惯用方法可以防止父类的受保护成员在子派生类型中被访问,但声明一个显然无用的新公共无用成员将是一种方法。最简单的事情就是空类。例如,如果类Foo声明了一个名为MemberwiseClone的空公共类,那么Foo的派生类将无法调用MemberwiseClone——如果MemberwiseClone会破坏类Foo的不变量,这可能是一件好事

(*)唯一合适的情况是,派生类的公共方法返回的类型比基类中的相应方法更专业(例如,CarFactory.product()方法可能返回一个Car,而FordExplorerFactory.product()方法可能返回一个FordExplorer(从Car派生)。对他们认为是汽车工厂(但恰好是FordExplorer工厂)调用product()的人将获得一辆汽车(恰好是FordExplorer),但对编译时已知为FordExplorer工厂的对象调用product()的人将得到编译时已知为FordExplorer的结果