C#泛型和继承问题

时间:2010-09-12 21:19:02

标签: c# generics interface

嘿,我想知道我想做的事情是否可能?代码中的注释应该给出并想出我正在努力实现的目标:)

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;
}

这可能是一个设计问题,我愿意重新考虑如果是:)

2 个答案:

答案 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的非泛型版本。对于IEnumerableIEnumerable<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 { ... }
}