继承与接口的区别
· C#只支持单继承,而接口则可以实现多继承。
· 继承父类的子类不一定要实现父类中的所有方法,但继承接口的类必须实现接口中的所有方法。
· 父类中的方法可以是虚方法,也可以是非虚方法,但接口中的所有方法都只能是虚方法。
· 父类中的字段、属性以及方法等可以使用除public以外的访问修饰符,但接口中的方法只能使用public修饰符(并非不能,只是不这么做接口的意义就没了)。
· 父类中可以定义字段(类似”string str”这样的叫做字段),而接口中只能定义属性(类似”public string {get; }”这样的叫做属性)。
以上讲的这些大概就是继承与接口的区别了。我一直觉得如清单般的罗列条目是一种糟糕的分享方法。在力所能及的范围内,我更乐于究其原理,因为只有明白了原理才能建起逻辑的大厦,并以此衍生推理。因此我讲讲我个人对它们二者的理解吧。
无论是实现继承,还是接口继承,我们通常都视之为继承。在我初识它们的时候我觉得它们完全就是一样的东西,但是后来我发现它们在功能上还是有不小的差别的。**实现继承体现的目的是为了使代码的层级结构更清晰,同时也是编程语言模块化的体现(这一点在后面讲override与new的区别时还会再讲)。**而接口则并不直接服务于这种需求,接口存在的目的是为了规范化实现了它的类。什么叫规范化?为什么要规范化?举个例子,我们在生活中也总是会遇到接口,譬如你的苹果手机没电了,正准备向别人接根电源线给自己的手机充电,那么很显然你决不会向我借我的小米数据线,因为你很清楚我的小米数据线和你的苹果手机接口不匹配。而我认为C#中的接口与这个例子中接口的意义是类似的。无论是苹果手机还是小米手机,他们都为自己的数据线制定了一套不可改变的标准,其中可能包括制定了他们各自的充电通路和数据通路等,且不说接口不同就无法插上,就算有人强行插上了不同接口的数据线,那么他的手机轻则无法正常充电,重则可能直接爆炸损毁。编码是现实生活的体现,因此在生活可能遇到的情况,在编码时肯定也是可能遇到的。假如C#中没有接口,而我们又无法避免在构建一个类时可能出现的纰漏,那么就有可能出现拿刚造出的小米数据线给苹果手机充电的可能。
overrider与new的区别
首先,override与new确实几乎没有区别。在我第一次接触到C#中的override与new时,我的老师和网上的几乎所有人一样,告诉我一个是重写,一个是覆盖,然后演示了一下类似于猫类继承动物类之后的调用结果,再然后。。。再然后就没有然后了,因为在子类中无论是使用override还是new重写/覆盖的父类方法,都依然可以调用到父类中的同名方法。
今天看书的时候又看到了这块,突然就来了感觉,于是自己试验了一下,发现似乎确实也没有问题了,于是决定把今天的试验结论写下来。
通常情况下,override与new没有任何差别,那么什么情况叫通常情况呢?直接上代码:
(1) 按照国际惯例,首先,咱们得创建一个父类
using System;
namespace MyCSharpStudy
{
class Father
{
public string name;
public Father(string name) {
this.name = name;
}
public void GetName() {
Console.WriteLine("I'm father : {0}.", name);
}
public virtual void VirtualGet() {
Console.WriteLine("This is father's method.");
}
}
}
(2) 然后是子类
using System;
namespace MyCSharpStudy
{
class Child:Father
{
public Child(string n