我有两个从基类派生的具体类。与混凝土classB相比,混凝土classA具有十个额外的属性。我有一个方法,其中一个参数是基类的列表,比如:List<baseClass>。在方法内部,我必须遍历列表,并强制转换为适当的具体类并访问属性。请让我知道如何实现这一点。有没有好的设计模式可以做到这一点?
发布于 2012-09-12 05:53:56
c#有一个可以查看的GetType方法。
您还可以使用is操作符
if (baseClass is derivedClass)
{
// do what you will with derived class.
}但
一般来说,你首先要做的是一个糟糕的设计模式。当您遍历基类,然后强制转换为派生类时,多态的全部意义就消失了。
也许你可以在你的基类中创建一个方法,它可以做你需要做的各种操作。
发布于 2012-09-12 05:54:58
这是基本的方法:
foreach(baseClass x in theList)
{
if (x is classA)
{
classA a = (classA) x;
...
}
else if (x is classB)
{
classB b = (classA) x;
...
}
}当您需要拆分多个类型时,它不会变得更简单。您可以尝试使用接口或不同的继承模型来避免整个事情。在没有看到更多细节的情况下,不可能准确地说出。
发布于 2012-09-12 17:40:48
我猜C#的dynamic类型可以成为你的朋友。
class BaseClass {}
class ConcreteClass1 : BaseClass
{
void Display1 () {}
}
class ConcreteClass2 : BaseClass
{
void Display2 () {}
}
void Enumerate (List<BaseClass> baseItems)
{
foreach (BaseClass baseItem in baseItems)
{
ConcreteAccessor ((dynamic)baseItem);
}
}
void ConcreteAccessor (ConcreteClass1 concreteItem1)
{
concreteItem1.Display1 ();
}
void ConcreteAccessor (ConcreteClass2 concreteItem2)
{
concreteItem2.Display2 ();
} 这里的关键是您有不同的重载,每个具体类一个重载,并使用dynamic无缝地调用其中一个重载。优点在于重载在运行时得到解决,使您的代码看起来很干净。
因为它是运行时类型解析,所以不执行编译时验证。假设您缺少某个具体类型的重载,并且运行时将baseItem解析为该特定的具体类型。然后它会导致运行时错误--崩溃--因为没有重载。
另一个问题是dynamic在幕后使用反射。正如你所知道的,反射会减慢你的应用程序。
https://stackoverflow.com/questions/12378450
复制相似问题