这是一个非常基本的OO问题,但我很好奇我是否已经过火了.
让我们假设以下层次结构,这是我通常会创建的示例:
IVehicle
- IFlyable
- IPlane
- Plane
- IHelicopter
- Helicopter
- IDrivable
- ICar
- Car
- ITruck
- Truck
Run Code Online (Sandbox Code Playgroud)
是接口IPlane,IHelicopter,ICar,和ITruck必要,否则应的类直接实现IFlyable和IDriveable?我正在寻找"最佳oo做法"的答案.
我想强制一个类从它实现的类中定义一个特定的变量.例如
class Fruit{
String name; // Cause each fruit has a name
}
//Apple wants to get an error if it does not use the name variable
class Apple implements Fruit {
String name = "Apple";
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?就像java.io.Serializable一样吗?
我有一个接口,IFindable由几个类实现.另一个World班有一个List<IFindable> items;
我在我的World类中设置了一个getItems方法,以返回IFindables列表.现在,我试图从我的Default.aspx.cs班级访问该列表(这是一个Web项目).不幸的是,我似乎无法,因为这个类不明白IFindable是什么.我收到以下错误:
Inconsistent accessibility: return type
'System.Collections.Generic.List<IFindable>' is less accessible than
method 'World.getItems()'
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我错了吗?
C#3.0中有哪些新的集合接口?
在C#2.0中
的IComparer
的IEqualityComparer
IEnumerator的
IEnumerable的
ICollection的
IDictionary的
IDictionaryEnumerator
IList的.
我是C#的新手.我想知道使用Collections的不同之处.我怀疑,之前可能会问以下问题(如果这样,请告诉我链接).
有什么区别
IList<int> intCollection = new List<int>();
Run Code Online (Sandbox Code Playgroud)
和
List<int> intCollection = new List<int>();
Run Code Online (Sandbox Code Playgroud)
我试图在Java中第一次使用泛型类型,因为我只希望我的构造函数接受实现"Anealable"接口的类.由于我得到的唯一错误,我的代码出现问题是"类型的非法启动",试图使其工作并没有走得太远
这是我班级的代码
package simulated_anealing;
public class Crystal extends Thread {
Object a;
public Crystal(<? implements Anealable> a)
{
this.a = a;
}
}
Run Code Online (Sandbox Code Playgroud) 我们有一个庞大的系统通过Unity与其数据源(Navision)松散绑定 - 我们有机会将其交换出来并拥有自己的数据库.
所以我们已经浏览了一下,并且非常喜欢Fluent NHibernate的外观 - 我们试图获得概念验证并交换掉一些服务.
我们想要使用NHibernates HiLo算法 - 不幸的是我们从Navision继承了字符串ID,它的ID是前缀(例如COL00001),所以要匹配我们需要使用字符串Id的接口.
有谁知道我会怎么样......
Id(x => x.ID).GeneratedBy.HiLo("100");
Run Code Online (Sandbox Code Playgroud)
在ID是字符串的地方工作?我们目前正在获取Identity必须是int,long等
谢谢,
安迪
------更新------
我在文章建议中尝试了这个例子但是这个功能已经从Fluent NHibernate的更高版本中删除了 - 但是有一个.Custom - 但我似乎无法让它工作!
public class ManufacturerMap : ClassMap<Manufacturer>
{
public ManufacturerMap()
{
Id(x => x.ID).GeneratedBy.Custom(typeof(StringTableHiLoGenerator));
Map(x => x.Name);
}
}
public class StringTableHiLoGenerator : TableHiLoGenerator
{
public override object Generate(ISessionImplementor session, object obj)
{
return base.Generate(session, obj).ToString();
}
}
Run Code Online (Sandbox Code Playgroud) 我需要编写一个接受一个对象的函数,但是我希望在函数调用中强制执行(不是在函数调用之后)该对象是一个接口.
意思是,我想确保在编译时这是一个接口,而不是在运行时.
我的意思是什么?
interface ISomething {...}
class A implements ISomething { ... }
ISomething something = new A();
MyClass.register(something);
Run Code Online (Sandbox Code Playgroud)
在这个例子中,传递的对象是一个接口,我希望MyClass.register函数在它的声明中强制执行这个要求.
我不知道我将获得哪个接口,并且没有定义另一个接口由所有其他实现实现,因为我需要真正的接口.
我想实现一个集合,其项目需要进行空虚测试.在引用类型的情况下,将测试为null.对于值类型,必须实现空测试,并且可能选择表示空白的特定值.
我的T的一般集合应该是两个值和参考类型值可用(意味着Coll<MyCalss>和Coll<int>都应该是可能的).但我必须以不同方式测试引用和值类型.
拥有一个实现IsEmpty()方法的接口,从我的泛型类型中排除这个逻辑,这不是很好吗?但是,当然,这个IsEmpty()方法不能是成员函数:它无法在空对象上调用.
我找到的一个解决方法是将收集项目存储为对象,而不是Ts,但它让我头疼(围绕拳击和强类型).在旧的C++中没有问题:-)
下面的代码演示了我想要实现的目标:
using System;
using System.Collections.Generic;
namespace StaticMethodInInterfaceDemo
{
public interface IEmpty<T>
{
static T GetEmpty(); // or static T Empty;
static bool IsEmpty(T ItemToTest);
}
public class Coll<T> where T : IEmpty<T>
{
protected T[] Items;
protected int Count;
public Coll(int Capacity)
{
this.Items = new T[Capacity];
this.Count = 0;
}
public void Remove(T ItemToRemove)
{
int Index = Find(ItemToRemove);
// Problem spot 1: This throws a compiler error: "Cannot convert null …Run Code Online (Sandbox Code Playgroud) 通过其他依赖,我的意思是抽象类,以及其他任何东西.
我有一个形式的一个项目dll,其需要一定的interface,IInput.测试项目也需要这个接口,所以我将这个接口放在我的主项目中,而后者又是一个单独的exe程序集.
这是因为当我将所有内容连接在一起时,最终主项目将需要使用此接口.现在我遇到的问题是当我尝试将主项目中的引用添加到dll时引用了主项目我收到了循环依赖.
我以前从未遇到过这个问题,也不知道对付它的最佳方法.作为一个临时修复我已经将界面移动到单独的dll,但很快我将在主项目中需要它,所以我回到了第一个方块.
编辑:
我应该提到设计,所以这里.
Menu
Menu Tests
Runner
Run Code Online (Sandbox Code Playgroud)
菜单具有IInput,它实际上是第三方库的接口适配器,以便进行单元测试.
所以菜单需要输入,但跑步者也是如此.转轮项目(exe)将需要输入,所以我将再次需要IInput.