隐藏基类的属性

Dar*_*Zon 3 c# generics inheritance base-class

我想要完成的是有两个类,非泛型和泛型.

我需要一个非泛型类,因为我打算插入这个类的对象并将它们插入一个 List<T>

这是代码

// Non-generic
public class Response
{
    public object Value { get; }
}

// Generic
public class Response<T> : Response
{
    public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想要一个List<Response>,当我访问这个对象时,我将Value属性作为对象.

但是当我将此对象作为泛型接收时,访问T Value属性并隐藏对象Value属性.

我希望明确,如果没有..请告诉我.

编辑:这是一个测验.因此,每个问题都有答案.例如,在MultipleChoiceQuestion中,它可以有几个答案A,B,C,D作为视图形状,或者可以是字符串或整数.

public abstract class Question
{
    public Question(string questionText)
    {
        this.QuestionText = questionText;
    }

    public string QuestionText { get; set; }
}

// Non-generic
public class Response
{
    public object Value { get; }
}

// Generic
public class Response<T> : Response
{
    public T Value { get; set; }
}

public class MathProblemQuestion : Question
{
    public Response Response { get; set; }
}

public class MultipleChoiseQuestion : Question
{
    public Response Response { get; set; }

    public IEnumerable<Response> PossibleResponses;

    ...
}

public class TrueOrFalse : Question
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

我个人只是给他们不同的名字.它将使您的生活简单,代码更清晰:

public abstract class Response
{
    public abstract object ObjectValue { get; }
}

public class Response<T> : Response
{
    public T Value { get; set; }

    public override object ObjectValue { get { return Value; } }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已经将这个Response类抽象化了 - 否则很难看出它如何优雅地工作; 如果Response它有自己的存储,Value那么可能被设置为非T值.希望这个摘要对你来说不是问题.

  • 根据您的项目设计,如果您仅在内部使用非泛型基类`Response`,您甚至可能将`ObjectValue`设为内部,因此您的API的消费者不知道/不关心您拥有对象升级器,它不会在intellisense中暴露(满足你"隐藏"属性的愿望). (2认同)