在Jesse Liberty的Programming C#(第142页)中,他提供了一个示例,他将对象转换为接口.
interface IStorable
{
...
}
public class Document : IStorable
{
...
}
...
IStorable isDoc = (IStorable) doc;
...
Run Code Online (Sandbox Code Playgroud)
这有什么意义,特别是如果对象的类实现了接口呢?
编辑1:澄清一下,我对转换的原因(如果有的话)感兴趣,而不是实现接口的原因.此外,这本书是他的2001年第一版(基于C#1,所以这个例子可能与以后版本的C#没有密切关系).
EDIT2:我在代码中添加了一些上下文
简单的问题 - 给定一个IList<T>如何在不自己编写方法的情况下执行二进制搜索,而不将数据复制到具有内置二进制搜索支持的类型.我目前的状况如下.
List<T>.BinarySearch() 不是会员 IList<T>ArrayList.Adapter()方法List<T>IList<T>不继承IList,因此使用ArrayList.Adapter()是不可能的我倾向于认为使用内置方法是不可能的,但我无法相信BCL/FCL中缺少这样的基本方法.
如果不可能,谁可以提供最短,最快,最智能或最美丽的二进制搜索实现IList<T>?
UPDATE
我们都知道在使用二进制搜索之前必须对列表进行排序,因此您可以假设它是.但我认为(但没有验证)排序是同样的问题 - 你如何排序IList<T>?
结论
似乎没有内置二进制搜索IList<T>.可以使用First()和OrderBy()LINQ方法进行搜索和排序,但它可能会受到性能影响.自己实现它(作为扩展方法)似乎是你能做到的最好的.
这是故事.我创建了一个界面IVehicle.我明确地在我的类中实现了接口Vehicle.cs.
这是我的界面:
Interface IVehicle
{
int getWheel();
}
Run Code Online (Sandbox Code Playgroud)
这是我的班级:
class Vehicle: IVehicle
{
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(getWheel());
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这getWheel()是明确实现的.现在,当我尝试在我的Vehicle类中调用该方法时,我收到一个错误,指示getWheel()当前上下文中不存在该错误.有人能帮助我理解我做错了什么吗?
我已经阅读了很多关于Java中的接口和类继承的内容,我知道如何做到这两点,我觉得我对两者都有很好的感觉.但似乎没有人真正将两者并排比较,并解释了何时以及为什么要使用其中一种.我没有发现很多次实现接口比扩展超类更好的系统.
那么什么时候实现一个接口,什么时候扩展超类呢?
我有一些适用于接口的类:
这是界面:
public interface Orderable
{
int getOrder()
void setOrder()
}
Run Code Online (Sandbox Code Playgroud)
这是工人阶级:
public class Worker
{
private List<Orderable> workingList;
public void setList(List<Orderable> value) {this.workingList=value;}
public void changePlaces(Orderable o1,Orderable o2)
{
// implementation that make o1.order=o2.order and vice versa
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个实现接口的对象:
public class Cat implements Orderable
{
private int order;
public int getOrder()
{
return this.order;
}
public void setOrder(int value)
{
this.order=value;
}
public Cat(String name,int order)
{
this.name=name;
this.order=order;
}
}
Run Code Online (Sandbox Code Playgroud)
在主要程序中,我创建了一个猫列表.我使用glazed列表在列表更改时以及使用此列表创建控件模型时动态更新控件.
目标是将此列表传输到工作对象,因此我可以在主过程中向列表中添加一些新的cat,并且工作人员将在不再设置其list属性的情况下知道它(list是main proc中的相同对象工人).但是当我把worker.setList(cats)它叫做关于期待可订购的警报时,却得到一只猫......但是Cat实现了Orderable.我该如何解决这个问题? …
我想创建自己的自定义注释.我的框架是Stand alone java应用程序.当有人注释他的pojo类时,后面的"隐藏"代码将触发方法.
例如,今天在Java EE中我们有@MessageDriven注释.当您使用@MessageDrivenMessageListener接口并使用MessageListener接口注释您的类时,会触发一个后面的代码onMessage(Message msg).当消息从队列/主题到达时.
如何创建@MyMessageDriven可以添加到pojo并实现的注释()MyCustomMessageListener.
我想要的结果是触发"隐藏"代码(我的),它将触发一个实现接口的方法(就像我在下面写的样本一样).
有人可以帮我理解为什么这段代码片段返回"Bar-Bar-Quux"?在阅读界面后,我很难理解这一点.
interface IFoo
{
string GetName();
}
class Bar : IFoo
{
public string GetName() { return "Bar"; }
}
class Baz : Bar
{
public new string GetName() { return "Baz"; }
}
class Quux : Bar, IFoo
{
public new string GetName() { return "Quux"; }
}
class Program
{
static void Main()
{
Bar f1 = new Baz();
IFoo f2 = new Baz();
IFoo f3 = new Quux();
Console.WriteLine(f1.GetName() + "-" + f2.GetName() + "-" + f3.GetName()); …Run Code Online (Sandbox Code Playgroud) 我正在创建几个NSView类,所有类都支持特殊操作,我们将调用它们transmogrify.乍一看,这似乎是协议的完美之处:
protocol TransmogrifiableView {
func transmogrify()
}
Run Code Online (Sandbox Code Playgroud)
然而,该协议并没有执行,每一个TransmogrifiableView是一个NSView为好.这意味着NSView我在a上调用的任何方法TransmogrifiableView都不会键入check:
let myView: TransmogrifiableView = getTransmogrifiableView()
let theSuperView = myView.superView // error: TransmogrifiableView does not have a property called 'superview'
Run Code Online (Sandbox Code Playgroud)
我不知道如何要求实现我的协议的所有类也是子类NSView.我试过这个:
protocol TransmogrifiableView: NSView {
func transmogrify()
}
Run Code Online (Sandbox Code Playgroud)
但是Swift抱怨协议不能从类继承.将协议转换为仅使用类的协议没有帮助
protocol TransmogrifiableView: class, NSView {
func transmogrify()
}
Run Code Online (Sandbox Code Playgroud)
我不能创建TransmogrifiableView超类而不是协议,因为我的一些TransmogrifiableView类必须是其他非transmogrifiable视图的子类.
我应该如何要求所有TransmogrifiableView的也可以NSView的?我真的不想用as"转换"来改变我的代码,这种转换形式不好而且分散注意力.
假设我有以下界面:
interface Mammal {
void marry(Mammal m);
Mammal giveBirthTo();
}
Run Code Online (Sandbox Code Playgroud)
但是,这并不完全是我想要的.
显然,人类不能嫁给狗,也不能生出一只猫.那么如何将这些信息嵌入到界面中,以便输入类型和输出类型可以在实现时自动更改?
我非常熟悉接口和抽象类的概念,但不熟悉mixins的概念.
现在,在Dart中,每个类都A定义了一个隐式接口,可以B通过使用implements关键字由另一个类实现.没有明确的方式来声明接口,例如,在Java中,接口只包含未实现的方法(最终是静态变量).在Dart中,由于接口是由类定义的,接口的方法A实际上可能已经实现,但实现的类B仍然需要覆盖这些实现.
我们可以从以下代码中看到这种情况:
class A {
void m() {
print("method m");
}
}
// LINTER ERROR: Missing concrete implementation of A.m
// Try implementing missing method or make B abstract.
class B implements A {
}
Run Code Online (Sandbox Code Playgroud)
在Dart中,mixin也是通过普通的类声明来定义的......
...原则上,每个类都定义了一个可以从中提取的mixin.但是,在此提议中,mixin只能从没有声明构造函数的类中提取.这种限制避免了由于需要在继承链上传递构造函数参数而引起的复杂化.
mixin基本上是一个可以定义未实现或实现的方法的类.这是一种将方法添加到另一个类而无需逻辑上使用继承的方法.在Dart中,mixin应用于超类,通过"正常"继承扩展,如下例所示:
class A {
void m() {
print("method m");
}
}
class MyMixin {
void f(){
print("method f");
}
}
class B extends A with MyMixin {
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们应该注意到,B …
interface ×10
c# ×3
java ×3
casting ×2
generics ×2
inheritance ×2
oop ×2
.net ×1
annotations ×1
dart ×1
explicit ×1
glazedlists ×1
list ×1
mixins ×1
protocols ×1
superclass ×1
swift ×1
typechecking ×1