如何使用泛型类型定义接口或类,而泛型类型拥有泛型类型

时间:2019-02-27 10:03:36

标签: c# oop generics types interface

我想定义一栋有多个(特殊和普通)房间的房子,每个房间都有(特殊和普通)东西的集合。

我开始为ThingCollection(和派生类)使用泛型,但是当我想定义房间类型时,我的泛型类型定义开始出现错误。

有人知道定义接口/类的正确方法,这样我不会收到此错误消息吗?

代码:

namespace City.Street.House
{
    // Thing(s)
    public interface IThing{ }
    public interface ISpecialThing : IThing { }

    // Collection(s)
    public interface ThingCollection<TThing> where TThing : IThing { }
    public interface SpecialThingCollection<TThing> : ThingCollection<TThing> where TThing : ISpecialThing { }

    // Room(s)  // Error On TThing in both rows below:
    public interface Room<TThingCollection> where TThingCollection : ThingCollection<TThing> { } 
    public interface SpecialRoom<TThingCollection> : Room<TThingCollection> where TThingCollection : SpecialThingCollection<TThing> { }

    // House(s)
    public interface House { }
}

错误消息:

  

CS0246 :找不到类型或名称空间名称“ TThing”(您是否缺少using指令或程序集引用?)

2 个答案:

答案 0 :(得分:1)

除非在方法的签名中也定义了TThing作为泛型约束中的类型参数,否则Room<TThingCollection>应该成为Room<TThingCollection, TThing>- 但这要起作用,您需要添加更多约束:

public interface Room<TThingCollection<TThing>> 
    where TThingCollection : ThingCollection<TThing> 
    where TThing : IThing
{ }

public interface SpecialRoom<TThingCollection<TThing>> : Room<TThingCollection> 
    where TThingCollection : SpecialThingCollection<TThing> 
    where TThing : ISpecialThing
{ }

或者您可以使用已声明为通用约束的接口(将TThing更改为IThingISpecialThing

 // Room(s)
public interface Room<TThingCollection> where TThingCollection : ThingCollection<IThing> { }
public interface SpecialRoom<TThingCollection> : Room<TThingCollection> where TThingCollection : SpecialThingCollection<ISpecialThing> { }

答案 1 :(得分:0)

@Zohar您给出的答案使我稍微重构了代码。

我使用了这段代码:

ias.on('loaded', function(data, items) {
        var title = data.match(/<title[^>]*>([^<]+)<\/title>/)[1];
        document.title = title.replace(/&amp;/g, '&')
            .replace(/&lt;/g, '<')
            .replace(/&gt;/g, '>')
            .replace(/&quot;/g, '"')
            .replace(/&#039;/g, "'");
    })

我还必须将collections接口更改为此:

// Room(s)
public interface Room<TThingCollection> where TThingCollection : ThingCollection<IThing> { }
public interface SpecialRoom<TThingCollection> : Room<TThingCollection> where TThingCollection : SpecialThingCollection<ISpecialThing> { }

没有这些集合更改,将无法正常工作。

非常感谢您的帮助!