使用继承?还是接口...

使用继承还是组合?这个问题的争论恐怕还在争论不休,微软鼓励程序员多使用继承,他们的理由是:扩展性好,因为,如果给应用添加一个功能的话,只要在基类上添加就可以了,其派生出来的子类不需要做任何修改,因为子类不需要了解父类;而对于接口来说就没这么容易了,不仅要修改接口,而且所有实现该接口的类也都要修改,这就给应用的扩展性带来了麻烦。所以微软推荐并鼓励程序员优先使用继承。

那为什么要使用接口呢?

1,可是实现同一接口的类有相同的行为(在.NET中还有属性);

2,可以限制用户操作的范围,如只给普通用户提供只读接口,那么用户就只有这些只读的操作,至于实现该接口的类还有什么其他的操作,普通用户就不得而知了,因为接口就只有这些。如:
class Program {
        static void Main(string[] args) {
            IBase b1 = (IBase)(new Person());
            IBase b2 = (IBase)(new Employee());
            Console.WriteLine(string.Format("{0}, age is {1}",b1.GetName(), b1.GetAge()));
            Console.WriteLine(string.Format("{0}, age is {1}",b2.GetName(), b2.GetAge()));
            //Console.WriteLine(string.Format("{0}, age is {1}", b2.GetName(), b2.Address)); //error
            Console.Read();
        }
    }

    interface IBase {
        int GetAge();
        string GetName();
    }

    class Person : IBase {
        private int _age = 20;
        private string _name = "mf";
       
        public int GetAge() {
            return this._age;
        }
        public string GetName() {

            return this._name;
        }
    }
    class Employee : IBase {
        private int _age = 20;
        private string _name = "mf";
        private string _address = "HangZhou";

        public int GetAge() {
            return this._age;
        }
        public string GetName() {

            return this._name;
        }
        public string Address {
            get {
                return this._address;
            }
            set {
                this._address = value;
            }
        }

有智能感知可以看出b1,b2有相同的方法GetAge()和GetName(),而b2看不到Employee类的Address属性,尽管该属性是共有的。所以使用IBase接口访问Employee类的用户就不能修改Address属性,提高了安全性。如下图:
    }图 1 b1可使用的方法列表

图 2  b2可使用的方法列表

因此,使用继承还是接口,要根据情况而定,最好找个两全其美的方法,技能满足应用的扩展性需求又能保证应用的安全性。这就需要系统架构师的能力了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值