C++ 隐式和显式的区别

用在什么不同的地方... 用在什么不同的地方 展开
 我来答
llzzcc66
2018-07-05 · 知道合伙人数码行家
llzzcc66
知道合伙人数码行家
采纳数:81385 获赞数:171484
公司运维员工

向TA提问 私信TA
展开全部
隐式实现和显示实现的例子 隐式地实现接口成员 创建一个接口,Chinese,包含一个成员 Speak;我们创建一个类Speaker,实现接口Chinese //隐藏式实现例子 public interface Chinese { string Speak(); }
public class Speaker : Chinese { public string Speak() { return "中文"; } }
这个就是隐式实现 显式地实现接口成员 -- 创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的。 创建一个接口,English,包含一个成员 Speak;让我们的类Speaker来实现接口English
//显式实现例子 public interface English { string Speak(); }
public class Speaker : English { string English.Speak() { return "English"; } }
隐式实现和显示实现的区别 1. 语法层面的区别 l 隐式方式Speaker的成员(Speak)实现有而且必须有自己的访问修饰符(public),显示实现方式Speaker的成员(Speak)不能有任何的访问修饰符。 l 显示实现方式Speaker使用接口名称和一个句点命名该类成员(Speak)来实现的:English.Speak() 2. Client的使用者层面 隐式实现的客户端调用,注意类的声明,可以用接口声明,也可以用实现类 Speaker声明。调用者都可以得到调用实例化对象的行为Speak; class Program { static void Main(string[] args) { Chinese c = new Speaker(); c.Speak();
Speaker s = new Speaker(); s.Speak(); } } 显式实现的客户端调用,注意类的声明,只可以用接口声明,调用者才可以可以得到调用实例化对象的行为Speak;
Code class Program { static void Main(string[] args) { English c = new Speaker(); c.Speak(); //下面写法将引起编译错误错误“PetShop.Speaker”不包含“Speak”的定义 // Speaker s = new Speaker(); // s.Speak(); } }
隐示实现对象声明为接口和类都可以访问到其行为, 显示实现只有声明为接口可以访问。 选择隐式实现还是显示实现 隐式和显式接口实现的关键区别显然并不在于方法声明,而是在于从类外部的可访问性。以下是一些基本的设计原则,可以利用它们来帮助自己选择显式还是隐式实现。 1. 业务语义的考虑? 考虑接口Chinese和English对于成员的Speak的业务需求,Speaker要实现这两个接口,如果采用隐式实现,语法没有问题,业务满足了吗? 例如: Code //服务端: public class Speaker : English, Chinese { public string Speak() { return "English"; } }
//调用端: class Program { static void Main(string[] args) { Chinese c = new Speaker(); c.Speak(); } }
呵呵,这完全可以编译通过,但是放在实际的业务场景去考虑,这不是很幽默吗?
这个时候就考虑使用一个显式的实现
显式实现 //服务端: public class Speaker:English,Chinese { string English.Speak() { return "English"; } string Chinese.Speak() { return "中文"; } }
//调用端: class Program { string English.Speak() { return "English"; }
string Chinese.Speak() { return "中文"; } }
2. 实现类是否准备让调用者独立使用? 虽然显示接口实现提供了更好的封装性,对调用者使用可以强制其进行接口声明,但是如果你准备让用户可以单独使用你这个类的功能,请提供隐式实现。 C#中的接口VS Java中的接口 Java中并没有在语言层面提供隐式和显式接口的实现,那么对于我们例子的中场景如何解决?当然有办法,只是没有C#优雅,还是Java故意在语言层面不提供这样的解决方案,难道认为他破坏了类的单一职责原则?我也在想这个问题,是不是一个Speaker只实现Chinese或者English之一那才是比较好的设计? C#中接口总结 接口描述的是可属于任何类或结构的一组相关功能。接口可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。接口不能包含字段。接口成员一定是公共的,而且是默认的,不要画蛇添足。 当类或结构继承接口时,意味着该类或结构为该接口定义的所有成员提供实现。接口本身不提供类或结构能够以继承基类功能的方式继承的任何功能。但是,如果基类实现接口,派生类将继承该实现。 如果一个类机继承类并实现接口,一定要吧类写在符号:后面的第一个位置。
武义菲亚伏电子有限公司
2023-06-12 广告
悬式绝缘子 FX WP 和 FXBW 的区别在于它们的结构和用途不同。1. FX WP 绝缘子:悬式玻璃绝缘子的导线连接方式是在芯棒和绝缘体之间加入了一根硅橡胶棒,以提高绝缘强度。此类绝缘子多用于架空输电线路和电站中的串联电缆上。2. FX... 点击进入详情页
本回答由武义菲亚伏电子有限公司提供
千锋教育
2016-07-22 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
显式是强制转换,而隐式是编译器自动转换的,一般同一数据类型(如byte,int,float,double),由低级转为高级为隐式(如int转为float或double),而高级转为低级为强制类型转换,即显式转换,须用户在代码中写的(如float转为int)。
隐式数据类型转换是有编译器完成的,例如:
char a = 'a';
int x = a;

显示需要编程过程中强制转换,例如
int a = 10;
double x = (double)a;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
江小右
2009-09-08 · TA获得超过6928个赞
知道小有建树答主
回答量:1195
采纳率:0%
帮助的人:829万
展开全部
#include <iostream>
using namespace std;

class A{
int x;
public:
A(){x=0;cout<<"Create A:0"<<endl;}
A(int a){x=a;cout<<"Create A:"<<x<<endl;}
~A(){cout<<"Delete A:"<<x<<endl;}
};

void main()
{
A a1;
A *a2=new A(10);
delete a2;
}

这个程序中:
A a1; 隐式调用了A()
A *a2=new A(10);显式调用了A(int a)
delete a2;以及程序结束时都隐式调用了析构函数~A()
自己研究下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友bd58c584d
2009-09-08 · 超过46用户采纳过TA的回答
知道答主
回答量:202
采纳率:0%
帮助的人:166万
展开全部
我理解的就是代码里写出来就是显式。。。。
下面这个理解很深刻:
http://www.soft6.com/tech/5/58393.html
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式