none
要怎麼寫這個泛型類別呢? RRS feed

  • 問題

  • 這個泛型類別要怎麼寫呢?

    我想寫一個泛型類別 SubClass<K, V>,這個類別必須
    1. 繼承 BaseClass<K, V>
    2. K 必須實怍 IKey 介面
    3, SubClass 必須實怍 ISubClass 介面

    程式碼如下

    namespace Test
    {
    public interface IKey
    {
    string Key { get;}
    }

    public interface ISubClass
    {
    string SubKey { get;}
    }

    public class BaseClass<K, V>
    {
    }

    // 這裡會發生錯誤
    public class SubClass<K, V> : ISubClass, BaseClass<K, V> where K : IKey
    {
    }
    }



    上面的程式碼中,這段敘述


    public class SubClass1<K, V> : ISubClass, BaseClass<K, V> where K : IKey
    {
    }


    C# Compiler 會發出錯誤訊息『基底類別 'BaseClass<...>' 必須在任何介面的前面』,要求把基底類別 BaseClass 寫在 ISubClass 前面,但是如果改成



    public class SubClass<K, V> : BaseClass<K, V> where K : IKey, ISubClass
    {
    }


    Compile OK,但是 C# Compiler 會解釋成為 K 必須實作 IValidator 和 IComparable。(理由很明顯,這時SubClass根本尚未實作 ISubClass)


    請問要怎麼寫才能達到真正的意思呢?
    2007年6月28日 上午 05:31

解答

  • public class SubClass<K, V> : BaseClass<K, V> where K : IKey, ISubClass
    {
    }
    這樣的寫法 應該是表示 K 必須實作 IKey及 ISubClass

    所以要寫成
        public class SubClass<K, V> : BaseClass<K, V>, ISubClass
            where K : IKey
        {

        }
    2007年7月3日 下午 05:11

所有回覆

  • HI,

     

    如果語意符合的話,可以讓BaseClass繼承ISubClass,再讓SubClass繼承自BaseClass,如下:

     

     public class BaseClass<K, V> : ISubClass
            {
                #region ISubClass 成員

                public string SubKey
                {
                    get { throw new Exception("The method or operation is not implemented."); }
                }

                #endregion
            }

            // 這裡會發生錯誤
            public class SubClass<K, V> : BaseClass<K, V>
                where K : IKey
            {
            }

     

    tihs

    2007年6月30日 上午 04:05
  • 謝謝  tihs

     

    雖然這樣 SubClass 就擁有上述三條件,但是必須在 BaseClass 實作 ISubClass 介面,子類別要實作的介面,在父類別實作有不一定可行,,因為父類別不會有子類別專屬的資訊。

     

    目前我需要把 ISubKey 介面定義在 SubClass ,可是不知道語法要怎樣寫,Compiler 才看得懂?

    2007年7月2日 上午 02:33
  • HI,

     

    如果父類別不知道子類別專屬的資訊, 可以宣告成abstract, 於製作子類別時再行定義

     

    tihs

    2007年7月2日 上午 03:32
  • 謝謝tihs,暸解您的意思。

    目前BaseClass是Concrete Class,已用來實體化物件,看來我必須調整一下物件架構。

    雖然一直覺得在不需使用多型或繼承時,把介面或方法提到父類別,會造成不必要的成本,而且,如果父類別只是dll而不是原始碼,還要增加一個中介層物件來串接,不過看起來目前C#語法就只能這樣做。

    2007年7月2日 上午 07:40
  • public class SubClass<K, V> : BaseClass<K, V> where K : IKey, ISubClass
    {
    }
    這樣的寫法 應該是表示 K 必須實作 IKey及 ISubClass

    所以要寫成
        public class SubClass<K, V> : BaseClass<K, V>, ISubClass
            where K : IKey
        {

        }
    2007年7月3日 下午 05:11
  • 謝謝 JamesYu,完全了解了。
    擺放位置的排列組合,意思完全不一樣。
    2007年7月6日 上午 02:39