我正在开发一个C#库,用户需要编写他/她自己的类,这些类继承自库中的给定类.我不认为编写更多细节会有所帮助,所以即使我要求的内容看起来很奇怪,也请考虑它.
在一个类中,我想要以下行为:两个互斥的" abstract"方法,如果实现一个,那么就不需要实现另一个(所以正确,它们不是真的abstract).
我需要强制用户实现这些方法中的至少一种,因此virtual仅声明这两种方法是不够的.实际上我可以声明两者abstract,但这意味着用户应该实现一个永远不会被调用的方法,当然我想避免这种情况.
是否有一个技巧或C#成语来做一些接近我想要的东西?也许有一些反思技巧我几乎一无所知?
我认为你要做的是违反了许多面向对象的设计目标.
"我需要强迫用户至少实现其中一种方法"
如果这两个类需要具有一个或另一个的功能,为什么不只是有一个抽象方法(或创建一个接口),并让两个类以不同的方式覆盖该方法?然后强制每个类实现一部分功能,另一个实现另一个类.
我建议重新思考你的方法,而不是花费大量的时间来尝试做出糟糕的方法.
编辑:根据您的意见,我将尝试进一步细节.
您可以尝试以下内容.但我怀疑你需要大幅扩展才能让它发挥作用.但无论如何,这应该让你开始
public class ResultFromMethod1 {
public bool optimized = false;
// other results here
}
Run Code Online (Sandbox Code Playgroud)
这将存储方法1的结果,并告诉您如何运行方法1.
public interface IInterfaceForMethod1 {
ResultFromMethod1 Method1 ();
}
public interface IInterfaceForMethod2 {
void Method2 (ResultFromMethod1 resultFromMethod1, Vector v);
}
Run Code Online (Sandbox Code Playgroud)
这些是两种方法的接口.请注意,它们尚未实现.这只是实现它们的类的合同.
public class UnoptomizedImplementation : IInterfaceForMethod1, IInterfaceForMethod2 {
#region IInterfaceForMethod1 implementation
public ResultFromMethod1 Method1 () {
ResultFromMethod1 resultFromMethod1 = new ResultFromMethod1 ();
resultFromMethod1.optimized = false;
// Method1 logic here
return resultFromMethod1;
}
#endregion
#region IInterfaceForMethod2 implementation
public void Method2 (ResultFromMethod1 resultFromMethod1, Vector v) {
if (!ResultFromMethod1.optimized) {
//if NOT optimized
//logic here
}
else {
//throw exception
}
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
这些类运行method1未优化,然后有一个方法2,要求方法1不优化.如果在未进行优化时不需要method2,那么就不要实现method2接口.
public class OptimizedImplementation : IInterfaceForMethod1, IInterfaceForMethod2 {
#region IInterfaceForMethod1 implementation
public ResultFromMethod1 Method1 () {
ResultFromMethod1 resultFromMethod1 = new ResultFromMethod1 ();
resultFromMethod1.optimized = true;
// Method2 logic here
return resultFromMethod1;
}
#endregion
#region IInterfaceForMethod2 implementation
public void Method2 (ResultFromMethod1 resultFromMethod1, Vector v) {
if (ResultFromMethod1.optimized) {
//if optimized
//logic here
}
else {
//throw exception
}
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
此类需要来自method1的输出,该输出已优化或引发异常.
我希望能让你走上一条更易于管理的轨道.