无法检索添加到List
本文关键字:object List 检索 添加 | 更新日期: 2023-09-27 18:09:00
我很难理解c#中的继承。假设我有两个这样的类
public class Base
{
public void print()
{
Console.WriteLine("this is a BASE method");
}
}
public class Derived : Base
{
public void print()
{
Console.WriteLine("this is a DERIVED method");
}
}
现在,当我创建一个
List<object>
,并尝试添加两个对象像这样尝试访问方法,我不能这样做
class Program
{
static void Main()
{
List<object> lists = new List<object>();
lists.Add(new Base());
lists.Add(new Derived());
foreach (var a in lists)
{
}
Console.ReadLine();
}
}
但是当我添加两个整数值并尝试访问它时,我能够访问它,这是怎么可能的?
static void Main()
{
List<object> lists = new List<object>();
lists.Add(4);
lists.Add(5);
foreach (var a in lists)
{
Console.WriteLine(a);
}
Console.ReadLine();
}
我如何能够得到整数值,甚至不转换它,我错过了一些关键的概念在这里,请帮助我理解
更新1
让我再解释一遍我的问题,当我想从添加的列表中调用一个方法时,我必须将其转换为相应的类型,就像这样
A a = lists[0] as A;
B b = lists[1] as B;
C c = lists[2] as C;
a.print();
b.print();
c.print();
但是当我像这样向列表中添加int时
List<object> lists = new List<object>();
lists.Add(4);
lists.Add(5);
foreach (var a in lists)
{
Console.WriteLine(a);
}
为什么不需要先把它转换成int然后再输出呢
您缺少的关键概念是.ToString()
在int
中被覆盖,这使得它打印数字而不是System.Int32
。您也可以通过简单地在函数中添加一个public override string ToString()
来使您的代码做到这一点。
public class Base
{
public override string ToString()
{
return "this is a BASE method";
}
}
public class Derived : Base
{
public override string ToString()
{
return "this is a DERIVED method";
}
}
class Program
{
static void Main()
{
List<object> lists = new List<object>();
lists.Add(new Base());
lists.Add(new Derived());
foreach (var a in lists)
{
Console.WriteLine(a);
}
Console.ReadLine();
}
}
要真正能够调用print()
,您需要将列表类型设置为Base
而不是object
,并且您需要将打印函数标记为基础的virtual
和派生的override
public class Base
{
public virtual void print()
{
Console.WriteLine("this is a BASE method");
}
}
public class Derived : Base
{
public override void print()
{
Console.WriteLine("this is a DERIVED method");
}
}
static void Main()
{
List<Base> lists = new List<Base>();
lists.Add(new Base());
lists.Add(new Derived());
foreach (var a in lists)
{
a.print();
}
Console.ReadLine();
}
多态性允许您在使用基类类型时调用子类的正确方法。然而,对它的一个限制是,它被设置为的类的类型也必须包含该方法。
您正在创建object
的列表,Object
类没有您试图在其内部调用的方法,因此您不能调用该方法。要纠正这个问题,您应该将列表更改为具有该方法的类型(在本例中为Base
)。
当传递一般object
类型时,Console.WriteLine
使用ToString
-该方法在任何类中都可用。
你可以在你的情况下重写它:
public class Base
{
public override string ToString()
{
return "this is a BASE method";
}
}
public class Derived : Base
{
public override string ToString()
{
return "this is a DERIVED method";
}
}
那么你可以这样使用:
foreach (var a in lists)
{
Console.WriteLine(a);
}
Integer
已经重写了这个方法-这就是为什么它工作。