这里没有完美的解决办法。 采取一些可能的办法:
一种做法是使A.Init(A.Init)(虚拟)在B中凌驾于该词,使它成为一种不受约束的Exception/InvalidOperationException。
Init () 留有可见之处,但用户很快发现不会使用(这明确表明Init(int info)将在XML文件和例外信息中使用)。
如果你不关心继承部分,而只是想利用B类A类的功能,则没有B类从A产生,也没有B即时A并利用其功能。
Edit:
You can use an interface implementing the common operations in order to retain inheritance while avoiding to implement Init() in B:
public interface IOperations
{
void DoStuff();
void Foo();
}
public class A : IOperations
{
public void Init()
{
// Do class A init stuff
}
#region IOperations Members
public void DoStuff()
{
// ...
}
public void Foo()
{
// ...
}
#endregion
}
public class B : IOperations
{
A _operations = new A();
public void Init(int initData)
{
_operations.Init();
// Do class B init stuff
}
#region IOperations Members
public void DoStuff()
{
_operations.DoStuff();
}
public void Foo()
{
_operations.Foo();
}
#endregion
}
可以通过使用工厂来做到这一点:
public static class OperationsFactory
{
public static IOperations CreateOperations()
{
A result = new A();
result.Init();
return result;
}
public static IOperations CreateOperations(int initData)
{
B result = new B();
result.Init(initData);
return result;
}
}
这样,即时代码就被很好地概括了起来,两种因诺特(Init)方法之间的区别从用户代码中隐蔽。