`
bcyy
  • 浏览: 1831143 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

那为什么要使用接口呢?

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可使用的方法列表

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

分享到:
评论

相关推荐

    9.java接口的继承.zip

    9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip...

    Java集合面试题.docx

    为何 Map 接口不继承 Collection 接口? 6. Iterator 是什么? 7. Enumeration 和 Iterator 接口的区别? 8. 为何没有像 Iterator.add()这样的方法,向集合中添加元素? 9. 为何迭代器没有一个方法可以直接获取...

    C++的概念/解释,可打印,华南师范大学C++考过。

    16. 为什么要使用继承 6 17. 保护成员的作用 6 18. 多重继承 6 19. 虚基类及其作用 6 20. 派生类的构造函数和析构函数的构造规则 7 21. 虚函数及其作用 7 22. 静态关联和动态关联 7 23. 函数重载与虚函数的不同 7 24...

    C#基础概念二十五问

    17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何手工释放资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params ...

    C#的25个问题(内附代码示例)

    17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何手工释放资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别?23.explicit 和 implicit 的含义? 24.params 有...

    java基础题 很全面

    26. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 10 27. List, Set, Map是否继承自Collection接口? 10 28. abstract的method是否可同时是static,是否可同时是...

    常见 ASP.NET 概念(开源,说明)

    17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何释放非托管资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params...

    c#基础学习问答c#基础学习问答

    17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何释放非托管资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params...

    Java 面试宝典

    20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继 承具体类(concrete class)? 抽象类中是否可以有静态的 main 方法? ...................... 16 21、写 clone()方法时,通常都有一行...

    java面试宝典

    20、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?.......................................................................2

    da06抽象继承封装多态接口.zip

    Flutter抽象继承封装多态接口案例,基于vscode开发工具,通过运行Flutter中的Test文件,来测试flutter中的继承,抽象,多态,封装,接口的概念

    java面试题(面试 宝典)

    11. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 11 12. 内部类的实现方式? 12 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 13 14. 如在COLLECTION框架中,实现比较要实现什么样的...

    java面试过程当中遇到的一些题目

    11. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 11 12. 内部类的实现方式? 12 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 13 14. 如在COLLECTION框架中,实现比较要实现什么样的...

    java面试题

    18. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 19. heap和stack有什么区别。 13 20. forward 和redirect的区别 13 21. EJB与JAVA BEAN的区别? 13 22. ...

    你必须知道的C#的25个基础概念(附源码)

    接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何释放非托管资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params 有...

    C#-继承和接口.ppt

    C#-继承和接口.ppt

    实验项目继承与接口模板.doc

    实验项目继承与接口模板.doc

    实验二继承及接口实验.doc

    实验二继承及接口实验.doc

Global site tag (gtag.js) - Google Analytics