2010-09-12 200 views
3

嘿,我想知道我想要做甚麼可能嗎?在代碼中的註釋應該給和想法是什麼,我想才達到:)C#泛型和繼承問題

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

這可能是一個設計問題,我願意重新考慮,如果是:)

回答

4

我會建議提取DoTest方法來一個超級接口,就像這樣:

interface ITestable 
{ 
    bool DoTest(); 
} 

interface ITest<T> : ITestable 
{ 
    T t { get; } 
} 

public class TestTest 
{  
    ITestable myTest; 
} 

在一個不相關的音符,故不推薦用於類的名字開始與「我」和性能開始與小寫字符。

+2

呀。當你可以稱之爲'StringTest' /'IntTest'時,也不建議調用'STest' /'ITest',它的可讀性會提高一百萬倍。 – Timwi 2010-09-12 21:36:00

+0

我不認爲特定的命名約定是這裏最重要的方面。 – 2010-09-12 21:37:34

+1

@Ondrej:沒有人說它是*最重要的。但是,任何使代碼更易於理解的代碼只會使OP受益。 – 2010-09-12 23:23:26

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 { ... } 
}