情况如下.
public interface IFoo { }
public abstract class FooBase : IFoo { }
Run Code Online (Sandbox Code Playgroud)
现在我需要IFoo一些额外的方法集合.
public class IFooCollection : List<IFoo>
{
public void UsefullMethod() { }
}
Run Code Online (Sandbox Code Playgroud)
问题是,IFooCollection当它是一个类时看起来像一个接口.选项如下.
IFooCollection- 我不喜欢这个,因为它看起来像一个界面.FooCollection- 我不喜欢这个,因为它不是foos的集合.FooBaseCollection因为所有的实现IFoo派生自FooBase- 我不喜欢这个,因为这可能永远不会是真的.IList<IFoo>因为只有一个完整的方法 - 我不喜欢这样,因为更改代码因为找不到类的名称...是的,这是令人讨厌的.那你会怎么做?我错过了一个命名约定吗?我们基本上使用这个Microsoft .NET库标准.
UPDATE
代码不会变得普遍 - 它只是在GUI工具中将一些数据放入服务器.所以我不关心将这些方法与其他集合一起使用或忽略这些方法.
寻找一种方法来做到这一点:
public interface INumber1 {}
public interface INumber2 {}
public class TestObject : INumber1, INumber2 {}
public static class TestClass
{
public static void TestMethod(INumber1&INumber2 testobject)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
调用TestMethod:
TestClass.TestMethod(new TestObject());
Run Code Online (Sandbox Code Playgroud)
问题是我需要一个参数来包含来自INumber1和INumber2的方法.提示?
我正在尝试使用Interactive Brokers Java API来查看我是否可以进行一些算法交易(最初在纸面上).我想调用一个叫做ReqMktDepth()类的方法EClientSocket.
该EClientSocket构造需要类型的对象AnyWrapper被传递,并且AnyWrapper是一个接口不是一个具体类.理论上我如何将AnyWrapper类传递给EClientSocket构造函数.
基本上我想知道特定命名空间中的所有类型是否实现了特定的接口IEnumerable.
我知道我能做到:
foreach type ...
if type is IEnumerable
...
Run Code Online (Sandbox Code Playgroud)
但我不想只是为了查询它是否实现了一个接口来强制转换类型,因为无论如何都会抛弃转换.
关于以下示例中的最佳做法,我有这个问题:
interface Request;
interface Service {
void process(Request request)
}
class MyService implements Service;
class YourService implements Service;
class MyRequest implements Request;
class YourRequest implements Request;
Run Code Online (Sandbox Code Playgroud)
但是如何确保MyService始终接受MyRequest并且YourService只会获得YourRequest,而不是相反?明显的答案"if-instance-of-check" MyService.process(...)看起来很丑陋并且不知何故反对SOLID原则.也许有更好的方法?
也许泛型会很好解决?(但是,如何在必须在Java 1.4下运行的代码中使用它们?)
我有一个接口有几个事件
我有基类实现接口
我有第三类扩展基类(让我们称之为theConcreteClass)
问题:当我做类似的事情: IMyInterface i = new theConcreteClass() 然后我订阅任何事件(i.someEvent + = some_handler ;)事件处理程序从未调用,因为(可能)事件订阅被分配给基类而不是具体类,即使new()运算符创建了具体类.
希望很明显:)
任何建议?
谢谢,
阿迪巴尔达
我有一些看起来如下的东西:
[CoolnessFactor]
interface IThing {}
class Tester
{
static void TestSomeInterfaceStuff<T>()
{
var attributes = from attribute
in typeof(T).GetCustomAttributes(typeof(T), true)
where attributes == typeof(CoolnessFactorAttribute)
select attribute;
//do some stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
然后我会这样称呼它:
TestSomeInterfaceStuff<IThing>();
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,它根本不会返回任何属性.
思考?
假设您正在编写库以在屏幕上显示内容,因此您可以创建一个IDisplayable界面.该接口有一种方法可以从对象创建控件:displayable.GetControl().
您想要创建自己的列表类型,可以显示:MyList<T>.现在这个列表只能T是一个IDisplayable,所以你可以在MyList类中询问T应该实现IDisplayable.但是当T不是IDisplayable时,你也想在某些地方使用这个列表类型(结果这个列表不可显示).那么可以说如果T实现了IDisplayable,MyList会实现IDisplayable吗?我也很高兴如果MyList<T>总是实现IDisplayable但是如果你尝试调用,GetControl()如果T不是IDisplayable,则会在运行时抛出异常,但我想知道是否有一种静态类型安全的方法来执行它.可以这样做吗?或者我在寻找错误的解决方案?
编辑:
我同意到目前为止MyList可能有太多责任的建议.我最初的想法是创造一个MyDisplayableList<T> : MyList<T> (where T : IDisplayable).
这种方法的问题是我有很多方法采用MyList并返回MyList(例如Linq中的Select方法).因此,如果我在MyDisplayableList上使用select,我会返回一个MyList,即使它是MyList,我也无法显示它...是否有一种类型安全的方法来处理C#中的这个问题?
请考虑以下两个包含我的问题的简化版本的Java文件
#a.java
package a;
public interface I {
//...
}
#b.java
package b;
public interface I {
//... (different stuff from a.I)
}
Run Code Online (Sandbox Code Playgroud)
您会注意到我的项目中有两个名为"I"的接口.这不能改变.我处于一种需要在单个类中使用这两种类型的情况.当然,我当然可以将它们的每个类型作为aI和bI引用,但我试图除了保持可读性之外什么也不做.
我想做这样的事情
interface B extends b.I {
}
Run Code Online (Sandbox Code Playgroud)
这可以让我通过使用B来使用I的接口,并且通过导入使用aI作为我.问题是这不起作用,让我们用这个具体的例子
interface MyList extends List<String> {
}
MyList l = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
这会产生类型错误.为什么Java"不知道"MyList扩展了List?
另外,我在上面的例子中尝试过转换,但是它会生成一个ClassCastException
思考?
如果这个问题听起来很愚蠢,我是新来的枚举集合,请原谅.
我上课了
public class PersonStuff : IPersonStuff, IEnumerable<User>
{
Person person = new Person();
...
IEnumerator<Person> IEnumerable<Person>.GetEnumerator()
{
return (person as IEnumerable<Person>).GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我在上面实现了两个接口:一个是IPersonStuff,另一个是IEnumerable.
Person类是一个简单的getter/setter,每个类型都是字符串,例如名称,地址除了dateofbirth是DateTime.
在我的IPersonStuff中我有这个:
interface IPersonStuff
{
...
IEnumerator<Person> IEnumerable<Person>.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)
一旦工作,我想以下面的方式(从任何类)来调用它:
IPersonStuff personStuff = new PersonStuff();
foreach (Person u in personStuff)
{
//this loop should iterate thru the elements.
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
基本上我想知道如何通过IPersonStuff接口调用我在PersonStuff类中的IEnumerator IEnumerable.GetEnumerator().
interface ×10
c# ×6
java ×3
.net ×2
generics ×2
types ×2
attributes ×1
collections ×1
events ×1
ienumerator ×1
polymorphism ×1
sockets ×1