Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        6年前关闭。
                                                                                            
                
        
考虑您有一个abstract base class A,它是从其他类X继承的。

类A覆盖方法foo1

很少有其他类A1,A2,A3是concrete类。

所有具体类均继承方法foo1

方法foo1几乎类似于应适用于所有具体类的通用算法。
由于算法中存在一个if条件,因此“几乎”是一个例外,某些类可以说只有A1,A3需要在foo2的开头使用其他方法foo

对于A2,我们不需要启动foo2

问题是如果我在类A中实现foo2,那么所有子元素也将继承此函数,这不是一个很好的设计吗?

我想将foo2排除在将由具体类->实现的接口之外,但这并不好,因为调用foo1foo2在基类上!

有什么想法如何以适当的方式解决这个问题?

谢谢

最佳答案

在这种情况下,我将使用的解决方案是使抽象类的另一层成为需要特殊Foo2的类的派生对象。

abstract class A : X
{
    public virtual void Foo()
    {
        //Foo logic
    }
}

abstract class B : A
{
    protected virtual void Foo2()
    {
        //Foo2
    }

    override void Foo()
    {
        Foo2();
        base.Foo();
    }
}

public A1 : B
{
}

public A2 : A
{
}

public A3 : B
{
}

关于c# - 面向对象设计之谜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17980906/

10-10 07:38