永久铸造到超类

时间:2010-10-29 15:59:06

标签: c# oop inheritance clone

如果:

class Car : Automobile
{}

我能做到:

Car toyota = new Car();
Automobile tauto = (Automobile)toyota;

但如果我tauto.GetType().Name,它仍然是 Car

是否可以执行强制转换,以便将类型永久更改为Automobile(无需克隆对象)?

我想要解决的问题是c#中没有多重继承,我需要在一个方法中合并来自2个服务的对象(具有相同的签名),并返回一种类型。

5 个答案:

答案 0 :(得分:11)

没有。如果不构建 new Automobile对象,就无法做到这一点。

但是,也没有理由这样做。 Liskov substitution principle表示任何Car都应该始终可以像Automobile一样对待,并且用户的预期行为不会发生变化。

只要您正确设计类层次结构,使用Car作为Automobile应始终完全可以接受。


旁注:这是使用Type.GetType()不是检查类型的首选方法的部分原因。在C#中使用isas关键字会更安全,也更好。如果您检查tauto is Car

,它们将返回true

答案 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。