Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IShell shell=new之间的区别是什么。。。外壳=新的_C#_Interface - Fatal编程技术网

C# IShell shell=new之间的区别是什么。。。外壳=新的

C# IShell shell=new之间的区别是什么。。。外壳=新的,c#,interface,C#,Interface,我正在阅读复合应用程序指南,经常遇到接口类型对象的实例化,例如: IShell shell = new Shell(); 而不是类型类: Shell shell = new Shell(); 这两者有什么区别 为什么要使用第一种方法(因为第二个shell对象可以在指定IShell接口的任何地方使用,对吗?) 明显的区别在于,第一个允许您仅将shell用作IShell,第二个允许您使用shell的所有功能,而这些功能恰好也包括IShell的功能 也许您可以从维护人员那里获取视图 首先,我们需

我正在阅读复合应用程序指南,经常遇到接口类型对象的实例化,例如:

IShell shell = new Shell();
而不是类型类:

Shell shell = new Shell();
  • 这两者有什么区别
  • 为什么要使用第一种方法(因为第二个shell对象可以在指定IShell接口的任何地方使用,对吗?)

明显的区别在于,第一个允许您仅将shell用作IShell,第二个允许您使用shell的所有功能,而这些功能恰好也包括IShell的功能

也许您可以从维护人员那里获取视图

首先,我们需要的是一个支持IShell的实例,如果我们愿意,我们可以将其更改为其他对象


第二种说法是,我们必须为它提供的某些功能指定一个Shell对象。

明显的区别在于,第一种方法允许您仅将Shell用作IShell,第二种方法允许您使用Shell的所有功能,这些功能恰好也包括IShell的功能

也许您可以从维护人员那里获取视图

首先,我们需要的是一个支持IShell的实例,如果我们愿意,我们可以将其更改为其他对象


第二种说法是,对于它提供的某些功能,我们必须有一个特定的Shell对象。

如果类有接口方法的显式实现,您可能需要这样做。考虑这个例子:

public interface ISomething { void Action(); }
public interface ISomethingElse {void Action(); }
public class Something : ISomething
{
    public void Action()
    {
    }
    void ISomething.Action()
    {
    }
}
public class Something2 : ISomething, ISomethingElse
{
    void ISomething.Action()
    {
    }
    void ISomethingElse.Action()
    {
    }
}
如果要对某个对象调用ISomething.Action,则必须使用ISomething变量来调用它。即使在Something2中,如果不通过接口执行操作,操作方法也是隐藏的

也就是说,您通常希望避免这样的实现。我怀疑框架类会强迫您这样做,但这将是使用接口声明它的场景

更新1:要稍微澄清一下,请提供一些关于如何获取方法的额外代码:

Something some = new Something();
some.Action(); //calls the regular Action
ISomething isome = some;
isome.Action(); //calls the ISomething.Action
((ISomething)some).Action(); //again, calls ISomething.Action

Something2 some2 = new Something2();
some2.Action();//compile error
((ISomething)some2).Action(); //calls ISomething.Action
((IsomethingElse)some2).Action(); // calls ISomethingElse.Action

如果类具有接口方法的显式实现,则可能需要这样做。考虑这个例子:

public interface ISomething { void Action(); }
public interface ISomethingElse {void Action(); }
public class Something : ISomething
{
    public void Action()
    {
    }
    void ISomething.Action()
    {
    }
}
public class Something2 : ISomething, ISomethingElse
{
    void ISomething.Action()
    {
    }
    void ISomethingElse.Action()
    {
    }
}
如果要对某个对象调用ISomething.Action,则必须使用ISomething变量来调用它。即使在Something2中,如果不通过接口执行操作,操作方法也是隐藏的

也就是说,您通常希望避免这样的实现。我怀疑框架类会强迫您这样做,但这将是使用接口声明它的场景

更新1:要稍微澄清一下,请提供一些关于如何获取方法的额外代码:

Something some = new Something();
some.Action(); //calls the regular Action
ISomething isome = some;
isome.Action(); //calls the ISomething.Action
((ISomething)some).Action(); //again, calls ISomething.Action

Something2 some2 = new Something2();
some2.Action();//compile error
((ISomething)some2).Action(); //calls ISomething.Action
((IsomethingElse)some2).Action(); // calls ISomethingElse.Action

对于第一个示例,您只能在源代码中使用IShell中指定的功能;对于第二个示例,您还可以使用接口中未定义的Shell对象的其他功能

如果您需要使用具有相同功能但不同实现的不同对象ShellEx替换Shell对象,则第一种解决方案提供了更大的灵活性。为此,您只需更改

IShell shell = new Shell();

代码的其余部分不需要更改

第二种解决方案使您能够使用Shell对象的完整功能


您必须根据具体情况确定当前情况下更可取的解决方案。

对于第一个示例,您只能在源代码中使用IShell中指定的功能,对于第二个示例,您还可以使用接口中未定义的Shell对象的附加功能

如果您需要使用具有相同功能但不同实现的不同对象ShellEx替换Shell对象,则第一种解决方案提供了更大的灵活性。为此,您只需更改

IShell shell = new Shell();

代码的其余部分不需要更改

第二种解决方案使您能够使用Shell对象的完整功能


您必须根据具体情况来决定,在当前情况下,哪种解决方案更可取。

一个类中可以有两个相同的方法,一个用于对象是类的实例时,另一个用于对象是接口的实例时,试着想想什么时候这会有用…@Edward当你实现两个接口时,恰好使用了相同的方法名-实际上根本不需要它,我只知道它就在那里,以防我遇到…这意味着我可以实例化一个实现接口的类,然后这个对象就不会实现接口的方法(你的第二个例子),这似乎与接口的观点背道而驰,也就是说,如果一个类实现了一个接口,它就实现了它的所有方法。你可以“实例化一个接口”,这似乎很奇怪,我一直把接口理解为“契约”类用来证明它们具有特定的结构并且可以在特定的环境中使用ways@Edward它们仍然是合同,我用样本更新了我的答案,说明了如何使用它。您仍在使用同一个实例,不同之处在于您正在告诉它为ISomething合同调用操作。如果它实现了其他接口的另一个Action方法,您可以将其称为toothat's wild,在一个类中可以有两个相同的方法,一个用于对象是该类的实例时,另一个用于对象是该接口的实例时,试着想想什么时候这会有用…@Edward当你实现两个接口时,恰好使用了相同的方法名-实际上根本不需要它,我只知道它就在那里,以防我遇到…这意味着我可以实例化一个实现接口的类,然后该对象不实现接口的方法(您的第二个示例),这似乎与接口的观点背道而驰,也就是说,如果一个类实现了一个接口,那么它实现了它的所有方法