日期:2014-05-17  浏览次数:20783 次

问一个问题,关于继承的。
我现在有一个基类 Base,

若干个子类 ChildA,ChildB,ChildC,D,E,F  等等......

现在 在程序中访问 子类 A B C,.... 以及调用子类的方法的时候都是通过基类的对象访问的 :
Base base.FuncA().....

现在 我想在 子类中增加一个方法,FuncB用来定义另一种行为,但是 并不是 所有的 子类都需要实现这种行为,比如:
子类 A、B、C,在实现FuncB的时候,有各自不同处理逻辑,
子类 D、E的在FuncB中的处理逻辑行为一样,
子类 F、G则不需要实现FuncB的处理逻辑,
。。。

如果这样的话,改将FuncB放在哪个类里面定义呢?
1、在基类Base中定义?
2、还是另外定义一个接口,让需要实现FUncB方法的子类继承自这个接口?
3、???

如果 2 的话,就不能同过基类base的对象访问了...

如何设计呢??

------解决方案--------------------
base只能访问到自己的方法列表。所以,想要base能调用funtionB,那么必须在base中有所定义。而只要继承了base的类,都会有functionB.

所以,F,G中也会有functionB,所以我觉得你的需求实现不了。但你可以override它,什么也不做。
------解决方案--------------------
这种情况的话要么实现一个接口(你的2里面),要么实现一个delegate(委托),这样你就可以在自己的子方法中去实现各种逻辑了,在设计的时候不涉及到子类,只有在客户端调用的时候才会有对子类的依赖,委托实现如下:
    public delegate void FuncBDel();

    public class Base
    {
        public void FuncA()
        {
            Console.WriteLine("Base.FuncA();");
        }

        public void FuncB(FuncBDel delOfFuncB)
        {
            delOfFuncB();
        }
    }

    public class ChildA : Base
    {
        public void FuncB()
        {
            Console.WriteLine("ChildA.FuncB();");
        }
    }

    public class ChildB : Base
    {
        public void FuncB()
        {
            Console.WriteLine("ChildB.FuncB();");
        }
    }

    public class ChildC : Base
    {
        public void FuncB()
        {
            Console.WriteLine("ChildC.FuncB();");
        }
    }


            Base b = new ChildA();
            b.FuncA();
     &nb