听起来您正在寻找的是接口。像这样的:
public interface ICanDoMethod1
{
void Method1();
}
public interface ICanDoMethod2
{
void Method2();
}
然后你可以在你的类中选择性地实现它们:
public class JustMethod1 : ICanDoMethod1
{
// implement Method1 here
}
public class Both : ICanDoMethod1, ICanDoMethod2
{
// implement both here
}
// etc.
本质上,任何给定的类都可以或不能多态地解释为任何给定的类型。如果你只想成为一种类型的part,那么你真正拥有的是两种类型。 C# 是单继承,因此要实现多种类型,您将使用接口。
相反,您也可以链接您的继承。像这样的:
public abstract class Base1
{
public abstract void Method1();
}
public abstract class BaseBoth : Base1
{
public abstract void Method2();
}
public class JustOne : Base1
{
// only implement Method1 here
}
public class Both : BaseBoth
{
// implement both here
}
如果选项堆叠,即如果您不希望能够选择并且想要“1”或“1 和 2”(但不仅仅是“2”),这将起作用。
作为最后的手段,您可以通过明确不实现其他方法来“选择性地实现”方法。它看起来像:
public class JustOne : BaseClass
{
public override void Method1()
{
// implement
}
public override void Method2()
{
throw new NotImplementedException();
}
}
但这将是一种反模式,您的对象会宣传他们故意不支持的功能。这意味着BaseClass 类型应该被认为是非常不稳定/不可靠的,因为任何消耗该类型的东西都无法知道它应该的实际行为。
最终,听起来你已经把你自己的类型画到了一个角落,你需要稍微支持一下并重新考虑它们。 Liskov 换人不应该如此掉以轻心。