使用继承还是组合?这个问题的争论恐怕还在争论不休,微软鼓励程序员多使用继承,他们的理由是:扩展性好,因为,如果给应用添加一个功能的话,只要在基类上添加就可以了,其派生出来的子类不需要做任何修改,因为子类不需要了解父类;而对于接口来说就没这么容易了,不仅要修改接口,而且所有实现该接口的类也都要修改,这就给应用的扩展性带来了麻烦。所以微软推荐并鼓励程序员优先使用继承。
那为什么要使用接口呢?
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接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip9.java接口的继承.zip...
为何 Map 接口不继承 Collection 接口? 6. Iterator 是什么? 7. Enumeration 和 Iterator 接口的区别? 8. 为何没有像 Iterator.add()这样的方法,向集合中添加元素? 9. 为何迭代器没有一个方法可以直接获取...
16. 为什么要使用继承 6 17. 保护成员的作用 6 18. 多重继承 6 19. 虚基类及其作用 6 20. 派生类的构造函数和析构函数的构造规则 7 21. 虚函数及其作用 7 22. 静态关联和动态关联 7 23. 函数重载与虚函数的不同 7 24...
17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何手工释放资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params ...
17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何手工释放资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别?23.explicit 和 implicit 的含义? 24.params 有...
26. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 10 27. List, Set, Map是否继承自Collection接口? 10 28. abstract的method是否可同时是static,是否可同时是...
17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何释放非托管资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params...
17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何释放非托管资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params...
20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继 承具体类(concrete class)? 抽象类中是否可以有静态的 main 方法? ...................... 16 21、写 clone()方法时,通常都有一行...
20、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?.......................................................................2
Flutter抽象继承封装多态接口案例,基于vscode开发工具,通过运行Flutter中的Test文件,来测试flutter中的继承,抽象,多态,封装,接口的概念
11. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 11 12. 内部类的实现方式? 12 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 13 14. 如在COLLECTION框架中,实现比较要实现什么样的...
11. 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 11 12. 内部类的实现方式? 12 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 13 14. 如在COLLECTION框架中,实现比较要实现什么样的...
18. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 19. heap和stack有什么区别。 13 20. forward 和redirect的区别 13 21. EJB与JAVA BEAN的区别? 13 22. ...
接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何释放非托管资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params 有...
C#-继承和接口.ppt
实验项目继承与接口模板.doc
实验二继承及接口实验.doc