C# 限制子类继承基类的某些方法
要求是:基类包含3个方法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
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)一起使用。