福建城市建设厅网站,网站后台编辑器不能用,互联网网站如何做流量统计,wordpress手机客户端端一小部分知识精英依旧直面核心困难#xff0c;努力地进行深度钻研#xff0c;生产内容#xff1b;而大多数信息受众始终在享受轻度学习#xff0c;消费内容。如果我们真的希望在时代潮流中占据一席之地#xff0c;那就应该尽早抛弃轻松学习的幻想#xff0c;锤炼深度学习…一小部分知识精英依旧直面核心困难努力地进行深度钻研生产内容而大多数信息受众始终在享受轻度学习消费内容。如果我们真的希望在时代潮流中占据一席之地那就应该尽早抛弃轻松学习的幻想锤炼深度学习能力逆流而上称为稀缺人才否则人生之路势必会越走越窄。——《认知觉醒》
接口的实现
接口的定义方式与类相似使用的代码如下
interface IMyInterface
{//Interface member.
}接口成员的定义与类成员的定义相似但具有几个重要的区别 【1】、不允许使用访问修饰符public、private、protected或internal所有接口成员都是隐式公共的。 【2】、接口成员不能包含代码体。 【3】、接口不能定义字段成员。 【4】、不能用关键字static、virtual、abstract或sealed来定义接口成员。 【5】、类型定义成员是禁止的。
但要隐藏从基接口中继承的成员可以用关键字new来定义它们例如
interface IMyBaseInterface
{void DoSomething();
}
interface IMyDerivedInterface:IMyBaseInterface
{new void DoSomething();
}其方式与隐藏继承的类成员的方式一样。
在接口中定义的属性可以定义访问块get和set中的哪一个能用于该属性或将它们同时用于该属性例如
interface IMyInterface
{int MyInt{get;set;}
}其中int属性MyInt有get和set存取器。对于访问级别有更严格限制的属性来说可以省略它们中的任一个。
注意这个语法类似于自动属性但自动属性是为类而不是接口定义的自动属性必须包含get和set存取器。
接口没有指定应如何存储属性数据。接口不能指定字段例如用于存储属性数据的字段。最后接口与类一样可以定义为类的成员但不能定义为其他接口的成员因为接口不能包含类型定义。
在类中实现接口
实现接口的类必须包含该接口所有成员的实现代码且必须匹配指定的签名包括匹配指定的get和set块并且必须是公共的。例如
public interface IMyInterface
{void DoSomething();void DoSomethingElse();
}
public interface MyClass:IMyInterface
{public void DoSomething(){};public void DoSomethingElse(){};
}可使用关键字virtual或abstract来实现接口成员但不能使用static或const。还可以在基类上实现接口成员例如
public interface IMyInterface
{void DoSomething();void DoSomethingElse();
}
public class MyBaseClass
{public void DoSomething(){}
}public class MyDerivedClass:MyBaseClass,IMyInterface
{public void DoSomethingElse(){};
}继承一个实现给定接口的基类就意味着派生类隐式地支持这个接口例如
public interface IMyInterface
{void DoSomething();void DoSomethingElse();
}
public class MyBaseClass:IMyInterface
{public virtual void DoSomething(){};public virtual void DoSomethingElse(){};
}
public class MyDerivedClass:MyBaseClass
{public override void DoSomething(){};
}显然在基类中把实现代码定义为虚拟派生类就可以替换该实现代码而不是隐藏它们。如果要使用new关键字隐藏一个基类成员而不是重写它则方法IMyInterface.DoSomething()就总是引用基类版本即使通过这个接口来访问派生类也是这样。
1、显式实现接口成员
也可以由类显式地实现接口成员。如果这么做就只能通过接口来访问该成员不能通过类来访问。隐式成员可以通过类和接口来访问。
例如如果类MyClass隐式地实现接口IMyInterface的方法DoSomething如上所述则下面的代码就是有效的
MyClass myObjnew MyClass();
myObj.DoSomething();下面的代码也是有效的
MyClass myObjnew MyClass();
IMyInterface myIntmyObj;
myInt.DoSomething();另外如果MyDerivedClass显示地实现DoSomething就只能使用后一种技术。其代码如下
public class MyClassIMyInterface
{void IMyInterface.DoSomething(){}public void DoSomethingElse(){}
}其中DoSomething是显示实现的而DoSomethingElse()是隐式实现的。只有后者可以直接通过MyClass的对象实例来访问。
2、其他属性存取器
如果实现带属性的接口就必须实现匹配的get/set存取器。这并不是绝对正确的——如果在定义属性的接口中只包含set块就可给类中的属性添加get块反之亦然。但只有隐式实现接口时才能这么做。另外大多数时候都想让所添加的存取器的可访问修饰符比接口中定义的存取器的可访问修饰符更严格。因为按照定义接口定义的存取器是公共的也就是说只能添加非公共的存取器。例如
public interface IMyInterface
{int MyIntProperty{get;}
}
public class MyBaseClass:IMyInterface
{public int MyIntProperty{get;protected set;}
}如果将新添加的存取器定义为公共的那么能够访问实现该接口的类的代码也可以访问该存取器。但是只能访问接口的代码就不能访问该存取器。 图片为现场调试图