我知道这是一个非常基本的问题,但是一位采访者以非常戏法的方式问我,我很无奈:(
我只知道接口的材料或理论定义,并且在我工作的许多项目中也实现了它.但我真的不明白为什么以及如何有用.
我也不了解界面中的一件事.即,例如,我们使用
conn.Dispose();在最后一块.但我没有看到该类正在实现或继承IDisposableinterface(SqlConnection)类我的意思.我想知道如何调用方法名称.同样,我不了解Dispose方法是如何工作的,因为我们需要使用我们自己的实现为所有接口方法实现函数体.接口如何被接受或命名为合同?到目前为止,这些问题一直在我心中滚动,坦率地说,我从来没有看到任何能以我能理解的方式解释我的问题的好线程.
MSDN像往常一样看起来非常可怕,没有一行是明确的(伙计们,善意的理由是谁进入高级开发,我强烈认为任何代码或文章应该达到任何人看到它的想法,因此像许多人说的那样,MSDN是没用的).
采访者说:
他有5种方法,他很乐意直接在课堂上实现它,但如果你必须选择抽象类或接口,你选择哪一种,为什么?我确实回答了他在各种博客中读到的所有内容,说明抽象类和界面的优缺点,但他不相信,他试图理解"为什么界面"."为什么抽象类"一般,即使我只能实现相同的方法一次而不是改变它.
我看不到网络中的任何地方,我可以得到一篇文章,可以清楚地解释我的接口及其功能.我是众多程序员中的一员,他们仍然不了解接口(我知道我使用的理论和方法)但不满意我清楚地理解它.
我想要一个可选参数并将其设置为我确定的默认值,当我这样做时:
private void Process(Foo f = new Foo())
{
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误(Foo是一个类):
'f'是Foo的类型,除string之外的引用类型的默认参数只能用null初始化.
如果我Foo改为struct那么它可以工作,但只有默认的无参数构造函数.
我阅读了文档,它清楚地表明我不能这样做,但它没有提到为什么?,为什么这个限制存在,为什么string被排除在外呢?为什么可选参数的值必须是编译时常量?如果那不是一个常数那么副作用会是什么?
编辑1:我知道有一些替代品,如伸缩式,这是一个纯粹的教育问题.
我知道这是真的,但为什么一定是这样呢?看起来像是这样的:
public class Foo{
private int bar;
public void SetBar(int baz = ThatOtherClass.GetBaz(3)){
this.bar = baz;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器可以将方法更改为:
public void SetBar(int baz){
//if baz wasn't passed:
baz = ThatOtherClass.GetBaz(3);
this.bar = baz;
}
Run Code Online (Sandbox Code Playgroud)
为什么那不起作用,或者不行,这只是一个设计决定?