首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#泛型-我可以让T来自两个选择之一吗?

C#泛型-我可以让T来自两个选择之一吗?
EN

Stack Overflow用户
提问于 2010-06-21 23:17:19
回答 5查看 13.9K关注 0票数 29

假设我有如下的类层次结构:

代码语言:javascript
复制
Class A {...}

Class B : A  {...}

Class C : A {...}

我目前所拥有的是

代码语言:javascript
复制
Class D<T> where T : A {...}

但是我想要一些形式的

代码语言:javascript
复制
Class D<T> where T in {B,C}

这是由于一些奇怪的行为,我不负责B和C有共同的方法,而这些方法不在A中,但如果能在T上的D中调用它们就好了。

注意:我没有权限访问A、B或C来编辑它们

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-21 23:21:15

你需要为B和C中的公共方法定义一个接口(让我们称之为Ibc),让B和C实现这个接口,然后你就可以写:

代码语言:javascript
复制
Class D<T> where T : A, Ibc {...}
票数 25
EN

Stack Overflow用户

发布于 2010-06-21 23:25:40

这不是直接可能的。

正如其他人所建议的,您可以定义一个接口并在BC中实现它。

如果这不是一个选项(例如,如果这些类超出了您的控制范围),我可能会建议这样做:首先,从一个抽象类开始,它包含您可以使用从A派生的任何T实现的所有功能。然后假设您有一些既适用于B又适用于C的方法,这些方法不是A的一部分。在D中,您可以使这些抽象方法由子类实现:

代码语言:javascript
复制
public abstract class D<T> where T : A
{
    protected T _member;

    public void DoSomethingAllTsCanDo()
    {
        _member.DoSomething();
    }

    public abstract void DoSomethingOnlyBAndCCanDo();
}

然后,您可以从每个类型BC的基类继承,并覆盖抽象方法以提供适当的功能:

代码语言:javascript
复制
public class DB : D<B>
{
    public override void DoSomethingOnlyBAndCCanDo()
    {
        _member.DoSomethingOnlyBCanDo();
    }
}

public class DC : D<C>
{
    public override void DoSomethingOnlyBAndCCanDo()
    {
        _member.DoSomethingOnlyCCanDo();
    }
}
票数 9
EN

Stack Overflow用户

发布于 2010-06-21 23:57:15

首先,如果B和C有共同的方法,这是一个设计缺陷,它们不共享一个接口。也就是说,您可以在不访问B和C的情况下修复它。

创建一个公共接口是可能的。假设你有:

代码语言:javascript
复制
public class A
{
}
public class B : A
{
    public void Start() { }
}
public class C : A
{
    public void Start() { }
}

您可以创建一个通用接口:

代码语言:javascript
复制
public interface IStartable
{
    void Start();
}

并在B和C的派生类上使用它:

代码语言:javascript
复制
public class BetterB : B, IStartable
{
}
public class BetterC : C, IStartable
{
}

如果按原样获取B和C实例,您可能无法实现这一点,但如果您创建它们,则可以考虑这一点。实际上,对于B和C的专用类,您可以使用接口而不是D<T>

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3085909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档