这是一个关于C#基础知识的哲学问题:我想知道完全抽象类可以模拟接口的接近程度.假设我们有以下界面:
public interface INativeInterface
{
void PerformAction();
String Property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下是抽象类:
public abstract class ISimulatedInterface
{
public abstract void PerformAction();
public abstract String Property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
他们有很多共同点,不是吗?我所知道的差异是:
使用反射或类似的东西可以跳过这些限制吗?
我意识到接口和抽象类在root中是不同的:接口声明了" 可以表现得像 " 的条件,抽象类 - " 是一种 ",但即使这似乎是如此接近以至于这些实体之间的低级别差异要讨论的.这个问题甚至可以听起来像"你会用C++创建一个接口".
我知道并理解Java中接口的价值.您编写接口,然后您可以更改您的实现,而无需使用该接口更改任何代码.通常,术语"合同"与接口一起使用.我理解它的方式是接口定义应用程序和实现之间的"契约".
所以,当我创建一个实现时,我必须履行合同.我的问题是,我必须履行的合同究竟是什么?
显然,您必须至少提供与接口具有相同签名的方法.否则代码将无法编译.这是所有的"合同"吗?似乎应该有更多.
例如,我读过一些文章,讨论测试界面与测试特定实现的价值,或两者兼而有之.我认为对接口进行测试非常有价值,这样您就可以知道哪些输入具有预期的输出.在我看来,这也将是"合同"界面的一部分.接口的每个实现都应该从相同的输入产生相同的输出.显然,没有办法在代码中强制执行此合同,但可以通过测试用例强制执行.我的想法在这里错了吗?
最后,实现有哪些副作用?在这里,我主要讨论可能作为实现的一部分发生的任何持久性.假设我有一个实现,它会在执行操作时将一些记录保存到数据库中.这会以某种方式成为界面"合同"的一部分吗?如果是这样,你怎么能执行这份合同?从界面层面来看,我不知道实现实际上在做什么.我所知道的是我给它输入,它给了我一个输出,我可以测试.发生的任何持久性是否也被视为"输出"?如果是这样,我只是看不出如何测试和执行.我是坚持无知的支持者,所以我可以知道应该坚持某些东西,但我不知道它是如何持久存在的.所以,我只是不知道什么时候实际存在的东西.如果您的界面有一些简单的CRUD操作可能很简单,但我想考虑更复杂的界面.
我希望我的问题有道理,有人可以提供一些好的反馈.我想一般性地讨论这个问题,但如果我不清楚我在谈论什么,我可以提供一个具体的例子.
我有两个问题
即使抽象类可以完成接口的功能,为什么我们在java中需要接口?
在搜索中,我发现抽象类无法完成接口功能的地方,即一个类需要实现多个接口。
这是在java中提出接口概念的唯一原因吗?
接口中的静态最终变量有什么用?欢迎需要说明接口中变量用法的示例程序。
提前致谢。
我对抽象类及其用法有一些疑问.我知道他们的基本知识; 例如,他们无法实例化,他们可以采用具体和抽象的方法,......但我想我想知道的是,他们在生活中服务的目的是什么(在软件工程中)?
Java中抽象类的目的是什么?为什么以及何时应该使用Abstract类?如果你可以使用普通类然后继承它,你为什么要继承一个抽象类?如何使用抽象类使我们的生活更轻松?它会提供更好的可维护性吗?更灵活?...
顺便说一句,我已经看过一些类似的问题和答案,包括理解Java中抽象类的目的,但它们没有回答我的问题.我更多地寻找答案,这些答案阐明了在Java中首先引入抽象类的哲学.
谢谢
从ConcurrentDictionary到IDictionary的转换是否会切断线程安全的实现,因为IDictionary没有GetOrAdd和AddOrUpdate方法?
可能重复:
接口与抽象类(通用OO)
嗨专家,
我正在阅读工厂模式
我们定义接口,接口由类实现.基于某些属性,我们决定实例化哪个类
我们定义抽象类并在子类中实现它.
列出的两个例子都非常不同.基于我记得的基本原理.
帮助我理解使用交互和使用抽象类的方式如何被称为工厂模式?
这两种有效的方法是?
抱歉格式化问题.
提前致谢
我已经了解了实现和接口的基础知识。我不明白什么时候使用接口。拥有一个接口需要什么条件?
例子:
/// Interface demo
Interface IDemo
{
// Function prototype
public void Show();
}
// First class using the interface
Class MyClass1 : IDemo
{
public void Show()
{
// Function body comes here
Response.Write("I'm in MyClass");
}
}
// Second class using the interface
Class MyClass2 : IDemo
{
public void Show()
{
// Function body comes here
Response.Write("I'm in MyClass2");
Response.Write("So, what?");
}
}
Run Code Online (Sandbox Code Playgroud)
这两个类具有相同的函数名称和不同的主体。这也可以在没有接口的情况下实现。提供方法参考的目的是什么?当我扩展超类时,至少我获得了超类的属性和方法。
请给我一个清晰的解释和一个现实世界的场景,以便我更好地理解。
考虑以下类:
class A {
void print() {
System.out.println("A");
}
}
class B extends A implements C {
}
public interface C {
void print();
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
继承的方法A.print()无法隐藏C中的公共抽象方法
现在,我明白print()为了消除编译错误必须公开,但这背后的原因是什么?
java ×6
interface ×5
oop ×5
.net ×2
c# ×2
concurrency ×1
factory ×1
implements ×1
inheritance ×1