Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用继承的类更改属性类型_C# - Fatal编程技术网

C# 使用继承的类更改属性类型

C# 使用继承的类更改属性类型,c#,C#,我见过类似的问题被问到和回答,但我仍然在为我的简单实现而挣扎。我希望能够返回具有不同返回类型的类属性。然后我希望能够在一个集合中互换使用它们 public ClassInt { public int Id { get; set; } public string MyValue { get; set; } } public ClassString { public int Id { get; set; } public int MyValue { get; set; } } 因此,除了My

我见过类似的问题被问到和回答,但我仍然在为我的简单实现而挣扎。我希望能够返回具有不同返回类型的类属性。然后我希望能够在一个集合中互换使用它们

public ClassInt
{
public int Id { get; set; }
public string MyValue { get; set; }
}

public ClassString
{
public int  Id { get; set; }
public int  MyValue { get; set; }
}
因此,除了MyValue上的返回类型之外,这些类是相同的。 这就是我到目前为止得到的:

public interface IBaseClass
{
    int Id { get; set; }
    object Value { get; set; }
}

public abstract class BaseClass <T> : IBaseClass
{
    public int Id { get; set; }
    public abstract T Value { get; set; }
}

public class ClassInt : BaseClass<int>
{
    private int _value;
    public override int Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
        }
    }
}

public class ClaseString : BaseClass<string>
{
    private string _value;
    public override string Value
    {
        get
        {
            return String.Format(“Hello: {0}”, _value);
        }
        set
        {
            _value = value;
        }
    }
}
公共接口IBaseClass
{
int Id{get;set;}
对象值{get;set;}
}
公共抽象类基类:IBaseClass
{
公共int Id{get;set;}
公共抽象T值{get;set;}
}
公共类ClassInt:基类
{
私有整数值;
公共覆盖int值
{
得到
{
返回_值;
}
设置
{
_价值=价值;
}
}
}
公共类类别字符串:基类
{
私有字符串_值;
公共重写字符串值
{
得到
{
返回String.Format(“Hello:{0}”,_值);
}
设置
{
_价值=价值;
}
}
}
要显示值,请执行以下操作:

List<IBaseClass> MyObjects = new List<IBaseClass>();

MyObjects.Add(new ClassString() { Id = 1, Name = "value 1", Value = "F1 String 1" });
MyObjects.Add(new ClassInt() { Id = 2, Name = "value 2", Value = 500 });

IBaseClass f0 = MyObjects[0];
IBaseClass f1 = MyObjects[1];
List MyObjects=new List();
添加(新的ClassString(){Id=1,Name=“value 1”,value=“F1 String 1”});
Add(new ClassInt(){Id=2,Name=“value 2”,value=500});
IBaseClass f0=MyObject[0];
IBaseClass f1=MyObject[1];
现在的问题是f0和f1没有公开Value属性

如有任何建议或意见,我们将不胜感激

谢谢

试试这个

public interface IBaseClass
{
    int Id { get; set; }
    object Value { get; set; }
}

public abstract class BaseClass<T> : IBaseClass
{
    public int Id { get; set; }

    public T Value { get; set; }

    object IBaseClass.Value
    {
        get { return Value; }
        set
        {
            // put some type checking and error handling here
            Value = (T)value;
        }
    }
}

public class ClassInt : BaseClass<int>
{
    // Properties specific for ClassInt, if you have any
    // (otherwise you don't even need this class anymore)
}
公共接口IBaseClass
{
int Id{get;set;}
对象值{get;set;}
}
公共抽象类基类:IBaseClass
{
公共int Id{get;set;}
公共T值{get;set;}
对象类。值
{
获取{返回值;}
设置
{
//在这里放置一些类型检查和错误处理
值=(T)值;
}
}
}
公共类ClassInt:基类
{
//ClassInt的特定属性(如果有)
//(否则,您甚至不再需要此类)
}

使您的
IBaseClass
通用:
IBaseClass
并将
对象值{get;set;}
更改为
T值{get;set;}
?在处理IBaseClass对象时是否需要设置该值?这并不是很有意义:D@CodeCaster当前位置他不能那样做,因为他想使用List@Jan你说得对。然后再看:“不清楚在不知道数据元素类型的情况下如何使用数据元素集合……”。好的,我看到了您在这里删除I->base->concrete继承并使抽象类和继承相互分离的做法。这是一个让它工作的“技巧”还是一个有效的OO方法?我问,因为在我看来,基类或接口可能会改变,而另一个可能不知道。此外,在具体类中使用对象需要使用手动验证,我认为这应该由系统来完成,如果可能的话。Ok使用一些具体类和删除的类来测试它,这些类没有任何实现,所有的工作都很好。一个很好的例子,两个人的想法比一个人好,批评导致更好的结果结果。我对我编辑过的回复也很满意。