Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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#_Oop_Inheritance_Clone - Fatal编程技术网

C# 永久铸造到超类

C# 永久铸造到超类,c#,oop,inheritance,clone,C#,Oop,Inheritance,Clone,如果: 我可以做到: class Car : Automobile {} 但是如果我做了tauto.GetType().Name它仍然是Car 是否可以执行强制转换,以便将类型永久更改为Automobile(无需克隆对象) 我试图克服的问题是c#中没有多重继承,我需要在一个方法中合并来自两个服务的对象(具有相同签名),并返回一种类型 不。如果不构建新的汽车对象,就无法实现这一点 然而,也没有理由这样做。声明说,任何汽车都应该可以像汽车一样进行治疗,用户的预期行为应该没有变化 只要正确设计类层次

如果:

我可以做到:

class Car : Automobile
{}
但是如果我做了
tauto.GetType().Name
它仍然是Car

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


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

不。如果不构建新的汽车对象,就无法实现这一点

然而,也没有理由这样做。声明说,任何
汽车
都应该可以像
汽车
一样进行治疗,用户的预期行为应该没有变化

只要正确设计类层次结构,将
Car
用作
Automobile
应该是完全可以接受的



另请注意:这就是为什么使用
Type.GetType()
不是检查类型的首选方法的部分原因。在C#中使用和关键字更安全、更好。如果您检查
tauto是Car
的话,它们将返回true。根据,您只是将引用投射到对象,而不是底层对象。

您的问题和您试图做的事情似乎是两件不同的事情。不,您不能更改对象的基础类型。但您似乎想做的是创建一种具有一组属性的汽车类型,而不是实际使用子类。你能做的是用一家汽车工厂来代替

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

其中AutomobileType是一个枚举。更多信息谷歌C工厂模式。

< P>我不确定你到底想做什么,但也许你可以考虑另一种方法。与其尝试使用继承合并两个不同类的功能,不如使用组合


在某些情况下,仿制药可能会有所帮助。如果方法包含泛型参数,则泛型类型将作为传入引用的声明类型而不是传入对象的类型进行计算。例如:

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();   
    }
}
无效Foo(T bar)
如果用(Control)someButton调用foo(),则“bar”的类型将是Button,而T的类型将是Control。

只是好奇:您为什么要这样做?很抱歉,请问您为什么要这样做?物体是汽车,不是汽车。如果您想要一辆汽车,那么实例化一个。说来话长,但它涉及实体框架POCOs,以及它无法使用相同的POCO类由两个不同的实体集返回。所以我必须通过继承来解决这个问题。。但是从外部来看,我希望两个视图中的对象是相同的。。所以只需返回超级类。简单强制转换是有问题的,因为像WCF serializer和.net 3.5泛型这样的东西仍然将强制转换对象视为子类。听起来,DataContext的设计可能是另一个问题的主题,因为实际问题不是关于强制转换对象,而是关于EF。它是:)不幸的是,WCF serializer关心,3.5仿制药也很重要。。所以我不能简单地更改代码。。我知道我可以提供自己的序列化,但这给我带来了很多麻烦。如果你真的需要把它变成一个子类,你需要构造一个新的对象。只需在汽车上创建一个新的构造函数,如下所示:
公共汽车(汽车其他)
,然后在传递给真正关心的例程时可以创建它。。。
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();   
    }
}
void Foo(T bar)