关于面向对象设计中接口的思考,广求最优解决方案

寻找爱玩Tom 发布于 2013/01/24 14:28
阅读 132
收藏 1

这两天自己写一个程序,突然间碰到这样一个问题,问题是不是网络中有答案,我也没百度过,不过自己思考了许久,还是想求大侠们指点。

问题描述:接口,类是可以实现多个接口的,这个毫无疑问,但是当一个类实现2个或者多个接口,通过反射机制或者其他机制获取对象实例,如何在多个接口之中进行切换。。。还是来断代码吧。。。:

public interface InnerInfo
    {
        string Name { get; set; }
        int Age { get; set; }

        void Eat();
    }

    public interface IExternalInfo
    {
        void Study();
    }

    public abstract class Animal : InnerInfo
    {
        public abstract string Name
        {
            get;
            set;
        }

        public abstract int Age
        {
            get;
            set;
        }
        public abstract void Eat();
   
       
    }

    public class Person : Animal, IExternalInfo
    {
        public override string Name
        {
            get;
            set;
        }
        
        public override int Age
        {
            get;
            set;
        }

        public Person()
        {
            Name = "张三";
            Age = 100;
        }

        public void Study()
        {
            Console.WriteLine("后天我具备学习能力!");
        }

        public override void Eat()
        {
            Console.WriteLine("天生我就具备吃的能力!");
        }
    }
上面代码是基础代码,然后Main()代码实现是如下:

 

class Program
    {
        static void Main(string[] args)
        {
            IExternalInfo obj=null;

            Type type = typeof(IExternalInfo);

            foreach (Type item in type.Assembly.GetTypes())
            {
                if (!item.IsAbstract && !item.IsInterface)
                {
                  obj = Activator.CreateInstance(item) as IExternalInfo;      
                }
            }
            if (obj != null)
            {
                //因为用反射所以只能调用IExternalInfo的接口
                obj.Study();

                //但是我想同时也获取IInnerInfo接口的方法或者属性,所以进行强制类型转换,可以成功,但是这里有个问题,如果强制转换不成功,就会发生异常,更好的办法去解决,比如说先判断是否能强制转换。
                IInnerInfo objobj = (IInnerInfo)obj;
                objobj.Eat();
                Console.WriteLine(string.Format("姓名:{0},年龄:{1}",objobj.Name,objobj.Age));

            }

            Console.ReadLine();
        }  
    }

求大侠给出好点的答案。。
其实我自己想了几种不怎么好的办法:

1.直接让接口IExternalInfo接口继承IInnerInfo接口,但是这种方法个人觉得非常糟糕,不赞同使用,接口本来就是规定不同类型的行为,这为了达到某个目的强制继承没有意义的接口。。

2.可以用Try...Catch进行异常捕获,这种方法倒是可以,但是也不是最优的个人觉得。。

以下是问题补充:

@寻找爱玩Tom:哎,经过几秒钟的思考,自己给自己找到了2方法: 1.if (obj is IInnerInfo)进行判断,再进行强制类型转换 2.或者采用 bool st = (typeof(IInnerInfo)).IsAssignableFrom(obj.GetType()); 进行判断再进行强制类型转换 (2013/01/24 14:41)
加载中
0
xwz
xwz

C#我不是太会, 说一下java怎么处理

Object obj = 反射出一个Person对象
if (obj instanceof Animal) {
Animal a = (Animal) obj;
//a.xxx()
}

if (obj instanceof IExternalInfo) {
IExternalInfo e = (IExternalInfo) obj;
//e.xxx()
}
.....

java的另一种判断方式
if (Animal.class.isAssignableFrom(obj.getClass())) {
Animal a = (Animal) obj;
//a.xxx()
}


0
寻找爱玩Tom
寻找爱玩Tom
这位仁兄谢啦,我自己经过几秒思考,也想的跟你一样,连函数方法用的基本都一样,呵呵
返回顶部
顶部