C#中的互斥抽象方法

Flo*_*oux 0 c#

我正在开发一个C#库,用户需要编写他/她自己的类,这些类继承自库中的给定类.我不认为编写更多细节会有所帮助,所以即使我要求的内容看起来很奇怪,也请考虑它.

在一个类中,我想要以下行为:两个互斥的" abstract"方法,如果实现一个,那么就不需要实现另一个(所以正确,它们不是真的abstract).

我需要强制用户实现这些方法中的至少一种,因此virtual仅声明这两种方法是不够的.实际上我可以声明两者abstract,但这意味着用户应该实现一个永远不会被调用的方法,当然我想避免这种情况.

是否有一个技巧或C#成语来做一些接近我想要的东西?也许有一些反思技巧我几乎一无所知?

Ada*_*m B 7

我认为你要做的是违反了许多面向对象的设计目标.

"我需要强迫用户至少实现其中一种方法"

如果这两个类需要具有一个或另一个的功能,为什么不只是有一个抽象方法(或创建一个接口),并让两个类以不同的方式覆盖该方法?然后强制每个类实现一部分功能,另一个实现另一个类.

我建议重新思考你的方法,而不是花费大量的时间来尝试做出糟糕的方法.

编辑:根据您的意见,我将尝试进一步细节.

您可以尝试以下内容.但我怀疑你需要大幅扩展才能让它发挥作用.但无论如何,这应该让你开始

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的输出,该输出已优化或引发异常.

我希望能让你走上一条更易于管理的轨道.