interface ITest<T> {
T t { get; }
bool DoTest();
}
public abstract class Test<T> : ITest<T> {
public Test (T nt) {
this.t = nt;
}
public Test () {
}
public T t {
get;
private set;
}
public abstract bool DoTest ();
}
public class STest : Test<string> {
public override bool DoTest () {
return true;
}
}
public class ITest : Test<int> {
public override bool DoTest () {
return true;
}
}
public class TestTest {
// I don't want to specify type here, I'd like TestTest to be able to have
// either a ITest or a STest. But for this class it should not matter.
// I just want to use DoTest() later on. No matter what
// specialication of Test this is.
Test myTest;
}
这可能是一个设计问题,我愿意重新考虑如果是:)
答案 0 :(得分:4)
我建议将DoTest
方法提取到超级接口,如下所示:
interface ITestable
{
bool DoTest();
}
interface ITest<T> : ITestable
{
T t { get; }
}
public class TestTest
{
ITestable myTest;
}
在一个不相关的说明中,不建议类名以“I”开头,而且属性以小写字符开头。
答案 1 :(得分:0)
将DoTest()
方法放在非通用ITest
界面中。另外,我建议使ITest
接口具有t
的非泛型版本。对于IEnumerable
和IEnumerable<T>
等接口,这是一种非常常见的方法。优点是非泛型版本的功能不强,因此可以在没有实际类型参数的地方充分利用。
interface ITest
{
object t { get; }
bool DoTest();
}
interface ITest<T> : ITest
{
T t { get; }
}
由于显式实现,可以隐藏不需要的非通用或通用版本(取决于实际情况):
class STest : ITest<S>
{
public string t { get; private set; }
string ITest.t { get { return t; } }
public bool DoTest { ... }
}