我有一个包含所有接口定义
的项目:RivWorks.Interfaces 我有一个项目,我定义了具体的实现:RivWorks.DTO
我之前已经完成了数百次但由于某种原因我现在收到此错误:
无法将类型'System.Collections.Generic.List <RivWorks.DTO.Product>'隐式转换为'System.Collections.Generic.List <RivWorks.Interfaces.DataContracts.IProduct>'
接口定义(缩写):
namespace RivWorks.Interfaces.DataContracts
{
public interface IProduct
{
[XmlElement]
[DataMember(Name = "ID", Order = 0)]
Guid ProductID { get; set; }
[XmlElement]
[DataMember(Name = "altID", Order = 1)]
long alternateProductID { get; set; }
[XmlElement]
[DataMember(Name = "CompanyId", Order = 2)]
Guid CompanyId { get; set; }
...
}
}
Run Code Online (Sandbox Code Playgroud)
具体类定义(缩写):
namespace RivWorks.DTO
{
[DataContract(Name = "Product", Namespace = "http://rivworks.com/DataContracts/2009/01/15")]
public class Product : IProduct
{
#region Constructors
public Product() { }
public …Run Code Online (Sandbox Code Playgroud) 我在C#上阅读的教科书中遇到过这些,但我很难理解它们,可能是由于缺乏背景.
是否有一个很简洁的解释,说明它们是什么以及它们对那里有用的东西?
编辑以澄清:
协变界面:
interface IBibble<out T>
.
.
Run Code Online (Sandbox Code Playgroud)
逆变接口:
interface IBibble<in T>
.
.
Run Code Online (Sandbox Code Playgroud) 我需要在班上有一些代表.
我想使用界面"提醒"我设置这些代表.
如何?
我的班级看起来像这样:
public class ClsPictures : myInterface
{
// Implementing the IProcess interface
public event UpdateStatusEventHandler UpdateStatusText;
public delegate void UpdateStatusEventHandler(string Status);
public event StartedEventHandler Started;
public delegate void StartedEventHandler();
}
Run Code Online (Sandbox Code Playgroud)
我需要一个界面来强制这些代表:
public interface myInterface
{
// ?????
}
Run Code Online (Sandbox Code Playgroud) 通常我们使用
@interface interface_name : parent_class <delegates>
{
......
}
@end
Run Code Online (Sandbox Code Playgroud)
在.h文件和.m文件中的方法中,我们合成了在.h文件中声明的变量的属性.
但是在某些代码中,这个@interface ..... @ end方法也保存在.m文件中.这是什么意思?他们之间有什么区别?
还要提供一些关于.m文件中定义的接口文件的getter和setter的话.
提前致谢
JDK 8中的新功能允许您在保留二进制兼容性的同时添加到现有接口.
语法就像
public interface SomeInterface() {
void existingInterface();
void newInterface() default SomeClass.defaultImplementation;
}
Run Code Online (Sandbox Code Playgroud)
这种方式对于所有现有的实现,SomeInterface当它们升级到这个新版本时,它们并不会突然编译错误newInterface().
虽然这很简洁,但当你实现两个接口时会发生什么呢?两个接口都添加了一个你没有实现的新默认方法?让我举个例子来解释一下.
public interface Attendance {
boolean present() default DefaultAttendance.present;
}
public interface Timeline {
boolean present() default DefaultTimeline.present;
}
public class TimeTravelingStudent implements Attendance, Timeline {
}
// which code gets called?
new TimeTravelingStudent().present();
Run Code Online (Sandbox Code Playgroud)
这被定义为JDK 8的一部分了吗?
我发现Java神在这里谈论类似的东西http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html,但它是私人邮件列表的一部分,我不能直接问他们.
有关如何在JDK 8中使用默认值以及扩展Collection接口以支持lambdas的更多详细信息,请参阅此处:https: //oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf
Java中的接口类似于类,但接口的主体只能包含抽象方法和
final字段(常量).
最近,我看到了一个问题,看起来像这样
interface AnInterface {
public default void myMethod() {
System.out.println("D");
}
}
Run Code Online (Sandbox Code Playgroud)
根据接口定义,只允许抽象方法.为什么它允许我编译上面的代码?什么是default关键字?
另一方面,当我试图写下面的代码时,它说 modifier default not allowed here
default class MyClass{
}
Run Code Online (Sandbox Code Playgroud)
代替
class MyClass {
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我default关键字的目的?是否只允许在界面内?它与default(无访问修饰符)有何不同?
像这样的问题的答案:List <T>或IList <T>似乎总是同意返回一个接口比返回一个集合的具体实现更好.但我正在努力解决这个问题.实例化接口是不可能的,因此如果您的方法返回一个接口,它实际上仍然返回一个特定的实现.我通过编写两个小方法来尝试一下这个:
public static IList<int> ExposeArrayIList()
{
return new[] { 1, 2, 3 };
}
public static IList<int> ExposeListIList()
{
return new List<int> { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)
并在我的测试程序中使用它们:
static void Main(string[] args)
{
IList<int> arrayIList = ExposeArrayIList();
IList<int> listIList = ExposeListIList();
//Will give a runtime error
arrayIList.Add(10);
//Runs perfectly
listIList.Add(10);
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,当我尝试添加新值时,我的编译器没有给我任何错误,但显然IList<T>当我尝试向其添加内容时,将我的数组公开为暴露的方法会产生运行时错误.因此,那些不知道我的方法中发生了什么,并且必须为其添加值的人,被迫首先将我复制IList到a List以便能够添加值而不会有错误.当然,他们可以做一个类型检查,看看他们是否正在处理a List或者a Array,但是如果他们不这样做,并且他们想要将项目添加到集合中,他们别无选择将其复制IList到a List,即使它已经是一个List.数组永远不会暴露为IList?
我的另一个问题是基于相关问题的接受答案(强调我的):
如果您通过其他人将使用的库公开您的类, …
我被问到一个问题,我想在这里查看我的答案.
问:在哪种情况下扩展抽象类而不是实现接口更合适?
答:如果我们使用模板方法设计模式.
我对么 ?
如果我无法清楚地陈述问题,我很抱歉.
我知道抽象类和接口之间的基本区别.
1)当需求需要在特定操作的每个子类中实现相同的功能(实现方法)和其他一些操作的不同功能(仅方法签名)时,使用抽象类
2)如果需要将签名设置为相同(并且实现不同),请使用接口,以便您可以遵守接口实现
3)我们可以扩展一个抽象类的最大值,但可以实现多个接口
重申一个问题:除了上面提到的那些之外,还有其他任何场景,具体我们需要使用抽象类(一个是模板方法设计模式在概念上仅基于此)吗?
接口与抽象类
在这两者之间做出选择真的取决于你想做什么,但幸运的是,对我们来说,Erich Gamma可以帮助我们一点.
一如既往地存在权衡,接口为您提供基类的自由,抽象类使您可以自由地在以后添加新方法. - Erich Gamma
你无法在不改变代码中的许多其他东西的情况下更改接口,因此避免这种情况的唯一方法是创建一个全新的接口,这可能并不总是一件好事.
Abstract classes应主要用于密切相关的对象.Interfaces更好地为不相关的类提供通用功能.
我想知道为什么PHP Trait(PHP 5.4)无法实现接口.
从user1460043的answer => ...更新不能要求使用它来实现特定接口的类
我明白这可能是显而易见的,因为人们可以认为如果一个人Class A正在使用一个Trait T正在实施的interface I,那么Class A应该是直接实现的interface I(这不是真的,因为Class A可以重命名特征方法).
在我的例子中,我的特性是从使用特征的类实现的接口调用方法.
该特征实际上是接口的一些方法的实现.所以,我想在代码中"设计"每个想要使用我的特性的类都必须实现该接口.这将允许Trait使用接口定义的类方法,并确保它们存在于类中.
在python中你怎么能扩展一个类?例如,如果我有
color.py
class Color:
def __init__(self, color):
self.color = color
def getcolor(self):
return self.color
Run Code Online (Sandbox Code Playgroud)
color_extended.py
import Color
class Color:
def getcolor(self):
return self.color + " extended!"
Run Code Online (Sandbox Code Playgroud)
但是这不起作用......我希望如果我工作color_extended.py,那么当我创建一个颜色对象并使用该getcolor函数时,它将返回带有字符串"extended!"的对象.到底.此外,它应该从导入gotton init.
假设python 3.1
谢谢
interface ×10
c# ×4
java ×3
.net ×2
java-8 ×2
abstraction ×1
class ×1
closures ×1
covariance ×1
default ×1
delegates ×1
getter ×1
header-files ×1
objective-c ×1
oop ×1
php ×1
python ×1
setter ×1
traits ×1