C# 限制子类继承基类的某些方法

C# 限制子类继承基类的某些方法,c#,overriding,class-design,C#,Overriding,Class Design,要求是:基类包含3个方法M1,M2,M3 派生类应该只继承M1,而second派生类应该只继承M2和M3 如何做到这一点?您不能有选择地继承这样的方法。派生类自动继承基类的所有公共方法。我建议您将Base类分为两类: using System; public class Base { public Base() { } public void M1() { } public void M2() { } pub

要求是:基类包含3个方法
M1
M2
M3

派生类应该只继承
M1
,而second派生类应该只继承
M2
M3


如何做到这一点?

您不能有选择地继承这样的方法。派生类自动继承基类的所有公共方法。我建议您将
Base
类分为两类:

using System;

public class Base
{
    public Base()
    {
    }

    public void M1()
    {
    }

    public void M2()
    {
    }

    public void M3()
    {
    }
}

public class Derived : Base
{
    //this class should get only method 1
}

public class SecondDerived : Base
{
    //this class should get only method 2 and method3
}

不能有选择地继承这样的方法。派生类自动继承基类的所有公共方法。我建议您将
Base
类分为两类:

using System;

public class Base
{
    public Base()
    {
    }

    public void M1()
    {
    }

    public void M2()
    {
    }

    public void M3()
    {
    }
}

public class Derived : Base
{
    //this class should get only method 1
}

public class SecondDerived : Base
{
    //this class should get only method 2 and method3
}

你不能这样做。继承意味着“是一种”关系

如果
SecondDerived
没有
M1()
,则它将与对
类基的引用不兼容


所以不管你在解决什么问题,也许你都不应该使用继承

你不能这样做。继承意味着“是一种”关系

如果
SecondDerived
没有
M1()
,则它将与对
类基的引用不兼容


所以不管你在解决什么问题,也许你都不应该使用继承

继承不可能实现您想要的功能

似乎您没有重写的意图,您只是希望有选择地从基类“继承”行为。您可以使用“has a”关系执行此操作:

public class Base1
{
    public Base1()
    {
    }

    public void M1()
    {
    }
}

public class Base2
{
    public void M2()
    {        
    }

    public void M3()
    {       
    }
}

public class First : Base1

public class Second : Base2
然后只需执行以下操作:

public class Base
{
     internal Base() {} //mark constructor as internal so it can not be used outside your assembly if necessary

     public Foo Mehtod1() {...}
     public Foo Mehtod2() {...}
     public Foo Mehtod3() {...}
}

更新:一个可能的替代解决方案是使您的
Base
类方法
virtual
并在派生类中重写它们,在那些您不希望类可用的方法中抛出
NotSupportedException
s。我真的不喜欢这个解决方案,但它的优点是不会失去polyphormism继承给您的功能,如果您有一些所有派生类都将共享的核心基础功能,那么它可能会很有用(在您的示例中,您似乎暗示它们不会)

继承不可能实现您想要的功能

似乎您没有重写的意图,您只是希望有选择地从基类“继承”行为。您可以使用“has a”关系执行此操作:

public class Base1
{
    public Base1()
    {
    }

    public void M1()
    {
    }
}

public class Base2
{
    public void M2()
    {        
    }

    public void M3()
    {       
    }
}

public class First : Base1

public class Second : Base2
然后只需执行以下操作:

public class Base
{
     internal Base() {} //mark constructor as internal so it can not be used outside your assembly if necessary

     public Foo Mehtod1() {...}
     public Foo Mehtod2() {...}
     public Foo Mehtod3() {...}
}

更新:一个可能的替代解决方案是使您的
Base
类方法
virtual
并在派生类中重写它们,在那些您不希望类可用的方法中抛出
NotSupportedException
s。我真的不喜欢这个解决方案,但它的优点是不会失去polyphormism继承给您的功能,如果您有一些所有派生类都将共享的核心基础功能,那么它可能会很有用(在您的示例中,您似乎暗示它们不会)

可以通过添加过时的属性

class A
{
     private Base internalBase;

     public A() { this.internalBase = new Base(); }

     public Foo Method1() { return this.internalBase.Method1(); }
}

class B
{
     private Base internalBase;

     public A() { this.internalBase = new Base(); }

     public Foo Method2() { return this.internalBase.Method2(); }
     public Foo Method3() { return this.internalBase.Method3(); }
}

可以通过添加过时的属性

class A
{
     private Base internalBase;

     public A() { this.internalBase = new Base(); }

     public Foo Method1() { return this.internalBase.Method1(); }
}

class B
{
     private Base internalBase;

     public A() { this.internalBase = new Base(); }

     public Foo Method2() { return this.internalBase.Method2(); }
     public Foo Method3() { return this.internalBase.Method3(); }
}

更多地解释为什么需求是这样的。简单地说,这是无法做到的。但是有了更多的信息,我们也许能够提供一个可行的解决方案。为什么会有反对票?不知道现在是否值得投票?这个问题表述得很清楚,不知道不是罪过……Jesuseen即使有办法阻止派生继承
Derived.M1
,它也可以将
这个
转换为
Base
,然后调用
Base.M1
。请详细解释为什么需要这样做。简单地说,这是无法做到的。但是有了更多的信息,我们也许能够提供一个可行的解决方案。为什么会有反对票?不知道现在是否值得投票?这个问题表述得很清楚,不知道不是罪过……Jesuseen即使有办法阻止派生继承
Derived.M1
,它也可以将
这个
转换到
Base
,然后调用
Base.M1
。我不确定我喜欢这个解决方案。如果M1、M2和M3共享状态信息或核心实现,会发生什么情况?在这个场景中,我会选择一个“has a”关系,并保持基类不变。@中间:我同意你的担心,但在没有进一步澄清的情况下,我只能针对他指定的内容提出一些建议。:)只是在更广泛和未指定的场景中吹毛求疵和思考。我不确定我是否喜欢这个解决方案。如果M1、M2和M3共享状态信息或核心实现,会发生什么情况?在这个场景中,我会选择一个“has a”关系,并保持基类不变。@中间:我同意你的担心,但在没有进一步澄清的情况下,我只能为他指定的内容提出一些建议。:)只是在更广泛和未指定的场景中挑剔和思考。+1 for“…将与[基类]不兼容参考”。另一方面,我看到了@InBetween建议的“not implementedException”,与接口(提示,提示)一起使用,+1表示“……将与[base class]引用不兼容”。另一方面,我看到了@InBetween建议的“notimplementedException”,它与接口(hint,hint)一起使用。