我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
好吧,我的一个朋友在编程中"界面"意味着来回走动.
什么是"界面"的最佳描述.
对我来说,一个接口是一个类的蓝图,这是最好的定义吗?
我对这件事情仍然有些困惑.我到现在所发现的是
(这里已经提出了类似的问题,但我还有其他一些观点.)
接口是仅抽象方法和最终字段的集合.
Java中没有多重继承.
接口可用于在Java中实现多重继承.
继承的一个优点是我们可以在派生类中使用基类代码而无需再次编写它.可能这是继承在那里最重要的事情.
现在..
Q1.由于接口只有抽象方法(没有代码)所以我们怎么说如果我们实现任何接口那么它是继承?我们没有使用它的代码.
Q2.如果实现接口不是继承,那么如何使用接口来实现多重继承?
Q3.无论如何使用Interfaces有什么好处?他们没有任何代码.我们需要在我们实现它的所有类中反复编写代码.
那么为什么要制作接口呢?
注意:我找到了一个接口有用的案例.它的一个例子就像在Runnable接口中我们有public void run()方法,我们在其中定义线程的功能,并且内置编码,该方法将作为单独的线程运行.所以我们只需要编写线程中的代码,Rest是预定义的.但是这个东西也可以用抽象类和所有东西来实现.
那么使用接口的确切好处是什么?我们使用Interfaces实现了多重继承吗?
有人可以为我揭开界面的神秘面纱,还是给我一些好的例子?我一直在这里和那里看到界面弹出,但我还没有真正接触到界面的良好解释或何时使用它们.
我在谈论接口与抽象类的上下文中的接口.
几年前我被迫进入一个工作中的软件项目,并被迫快速学习C#.我的编程背景很弱(经典ASP).
多年来我学到了很多东西,但由于我学习C#的强制性,我还有很多基本概念.
具体来说,一个界面.我理解基础知识,但在编写应用程序时,我很难弄清楚它的实际用途.为什么要为他们的应用程序编写接口?
谢谢凯文
我仍然无法理解哪些接口有益.我阅读了一些教程,但我仍然不知道它们的真正含义是"他们让你的课程保持承诺"和"他们帮助多重继承".
多数民众赞成.我仍然不知道什么时候甚至可以在实际工作示例中使用接口,甚至何时确定何时使用它.
根据我对接口的有限知识,他们可以提供帮助,因为如果某些东西实现了它,那么你可以通过接口允许传入类似不同的类,而不必担心它不是正确的参数.
但是我从来不知道真正的意义是什么,因为他们通常在这一点上停止显示代码在通过界面后会做什么,如果他们这样做,似乎他们没有做任何有用的事情,我可以看看并去"哇,他们会在现实世界的例子中帮助".
所以我想我要说的是我正在尝试找到一个真实世界的例子,我可以看到界面在行动.
我也不明白你可以做像这样的对象的引用:
ICalculator myInterface = new JustSomeClass();
Run Code Online (Sandbox Code Playgroud)
所以现在如果我去myInterface点和intellisense会拉起来我只会看到接口方法而不是JustSomeClass中的其他方法.所以我还没有看到这一点.
我也开始进行单元测试,他们似乎喜欢使用接口,但我仍然不明白为什么.
比如这个例子:
public AuthenticationController(IFormsAuthentication formsAuth)
{
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
}
public class FormsAuthenticationWrapper : IFormsAuthentication
{
public void SetAuthCookie(string userName, bool createPersistentCookie)
{
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
}
public void SignOut()
{
FormsAuthentication.SignOut();
}
}
public IFormsAuthentication FormsAuth
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
喜欢为什么要打扰这个界面呢?为什么不使用其中的方法制作FormsAuthenticationWrapper并将其称为一天?为什么首先创建一个接口然后让Wrapper实现接口然后最后编写方法?
然后我不明白这句话真的在说什么.
就像我现在知道声明说的那样
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Run Code Online (Sandbox Code Playgroud)
如果formsAuth为null,则创建一个新的FormsAuthenticationWrapper,然后将其分配给作为Interface的属性.
我想这可以追溯到为什么参考的东西.特别是在这种情况下,因为所有方法都完全相同.Wrapper没有接口没有的任何新方法,我不确定但是当你这样做时,方法被正确填充(即它们有一个体),它们不会被转换为存根,因为这看起来真的没有意义对我来说(它将被转换回界面).
然后在测试文件中他们有:
var formsAuthenticationMock = new Mock<AuthenticationController.IFormsAuthentication>();
Run Code Online (Sandbox Code Playgroud)
所以他们只是传递FormsAuthentication,我猜测所有的假存根.我猜测程序实际运行时会使用包装类,因为它有真正的方法可以执行某些操作(比如签署一个人).
但是看看新的Mock(来自moq)它会接受一个类或一个接口.为什么不再让包装类把那些方法放进然后在新的Mock调用中呢?
这不只是为你制作存根吗?
我是OOP的新手并且有一些问题.
为什么接口中声明的方法不能具有修饰符(public,private等).
在这段代码中:
class Program
{
static void Main(string[] args)
{
X ob = new Y();
ob.add(4, 5);
Z ob1 = new Y();
ob1.mull(2, 3);
Console.Read();
}
}
public interface X
{
void add(int x, int y);
}
public interface Z
{
void mull(int x, int y);
}
class Y : X, Z
{
void X.add(int x, int y)//here we are not decalring it as public ,why?
{
Console.WriteLine("sum of X and y is " + (x + y));
} …Run Code Online (Sandbox Code Playgroud) 可能重复:
我如何知道何时创建界面?
我想知道使用接口的意义.
你使用Interfaces吗?如果是这样,您何时决定使用它们,何时决定不使用它们?
我现在已经为我的服务层和我的存储库层定义了接口,但我想知道我是否错过了其他有用的地方.
我想我只是不完全明白他们的目的.
我们定义接口如下:
interface IMyInterface
{
void MethodToImplement();
}
Run Code Online (Sandbox Code Playgroud)
以及如下的恭维:
class InterfaceImplementer : IMyInterface
{
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.MethodToImplement();
}
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
}
Run Code Online (Sandbox Code Playgroud)
而不是创建一个接口,为什么我们可以直接使用该功能如下:-)
class InterfaceImplementer
{
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.MethodToImplement();
}
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
可能重复:
使用Java [接口/抽象类]
与普通Java类相比,接口有什么好处.有人向我解释说,界面就像合同,但我只是不明白.为什么不坚持上课?
interface ×10
oop ×7
c# ×5
.net ×2
inheritance ×2
java ×2
asp.net-mvc ×1
class ×1
class-design ×1
definition ×1