如果:
class Car : Automobile
{}
我能做到:
Car toyota = new Car();
Automobile tauto = (Automobile)toyota;
但如果我tauto.GetType().Name
,它仍然是 Car 。
是否可以执行强制转换,以便将类型永久更改为Automobile(无需克隆对象)?
我想要解决的问题是c#中没有多重继承,我需要在一个方法中合并来自2个服务的对象(具有相同的签名),并返回一种类型。
答案 0 :(得分:11)
没有。如果不构建 new Automobile对象,就无法做到这一点。
但是,也没有理由这样做。 Liskov substitution principle表示任何Car
都应该始终可以像Automobile
一样对待,并且用户的预期行为不会发生变化。
只要您正确设计类层次结构,使用Car
作为Automobile
应始终完全可以接受。
旁注:这是使用Type.GetType()
不是检查类型的首选方法的部分原因。在C#中使用is和as关键字会更安全,也更好。如果您检查tauto is Car
。
答案 1 :(得分:0)
根据MSDN,您只是将引用转换为对象,而不是基础对象。
答案 2 :(得分:0)
你的问题以及你想要做的事情似乎是两件不同的事情。不,你不能改变对象的基础类型。但你似乎想要做的是创建一种具有一组属性的汽车,而不是实际使用子类。你可以做的是改用汽车工厂。
public static class AutomobileFactory()
{
public static Automobile CreateAutomobile(AutomobileType type)
{
...
}
}
其中AutomobileType是枚举。有关更多信息,请访问Google C#Factory模式。
答案 3 :(得分:0)
我不确定你要做的确切是什么,但也许你可以考虑采用不同的方法?可能你可以使用组合,而不是尝试使用继承合并两个不同类的功能?
http://tiedyedfreaks.org/eric/CompositionVsInheritance.html
public class Service
{
public virtual void DoSomething()
{
}
}
public class ServiceA : Service
{
public override void DoSomething()
{
}
}
public class ServiceB : Service
{
public override void DoSomething()
{
}
}
public class ServiceA_B : Service
{
ServiceA serviceA = new ServiceA();
ServiceB serviceB = new ServiceB();
public override void DoSomething()
{
serviceA.DoSomething();
serviceB.DoSomething();
}
}
答案 4 :(得分:0)
在某些情况下,仿制药可能有所帮助。如果方法包含泛型参数,则泛型类型将被计算为传入引用的声明类型,而不是传入对象的类型。例如:
void Foo(T bar)
如果用(Control)someButton调用foo(),'bar'的类型将是Button,但T的类型将是Control。