抽象类中的C#抽象方法,其子类返回不同的类型

时间:2014-03-03 02:25:09

标签: c# inheritance abstract-class abstraction abstract-methods

我理解此处发布的解决方案Different return types of abstract method in java without casting

但是,我不认为我可以使用泛型,因为其他一些类包含“内容”,我不想在编译时决定它使用哪种类型的内容。

public abstract class Content {
    public abstract Content getContent();
}

public class UrlContent : Content  {
    public String s;
    public getContent(){ return s;}

}

public class ImageContent : Content  {
    public Byte[] image;
    public getContent(){ return image;}
}

2 个答案:

答案 0 :(得分:3)

您可以使用generics完成此操作,并且仍然维护一个非通用接口,您可以在任何您不需要知道返回类型的地方引用它,例如:

public interface IContent {
    object GetContent();
}

public abstract class Content<T> : IContent {
    public abstract T GetContent();
    object IContent.GetContent() 
    {
        return this.GetContent(); // Calls the generic GetContent method.
    }
}

public class UrlContent : Content<String>  {
    public String s;
    public override String GetContent() { return s; }
}

public class ImageContent : Content<Byte[]>  {
    public Byte[] image;
    public override Byte[] GetContent(){ return image; }
}

答案 1 :(得分:1)

假设后面的实现意味着public override Content getContent()方法......

您已将函数声明为返回Content对象,然后尝试从中返回String或Byte []。这不行。如果您希望能够返回任意数量的类型,最简单的方法是返回Object而不是Content,这对于byte []或string可以正常工作。它还可以作为对调用代码的警告,数据类型可以是任何内容。

您也可以使用您在该链接中引用的泛型,并让不返回特定类型的类将自己定义为public class StrangeContent : Content<object>,这样它们就可以返回多种数据类型而不必强制所有实现松散的打字。