C# C-将接口转换为备用基类?

C# C-将接口转换为备用基类?,c#,inheritance,C#,Inheritance,我在将已经实现的接口转换为其他类时遇到问题,我希望执行一些其他方法 public interface ISomeInterface { int Widgets { get; set;} } public class SomeClassA : ISomeInterface { int Widgets { get; set;} } public class SomeClassB : ISomeInterface { int Widgets { get; set;}

我在将已经实现的接口转换为其他类时遇到问题,我希望执行一些其他方法

public interface ISomeInterface
{
    int Widgets { get; set;}
}

public class SomeClassA : ISomeInterface
{
    int Widgets { get; set;}
}

public class SomeClassB : ISomeInterface
{
    int Widgets { get; set;}
    public void DoExtraStuff() {...}
}

ISomeInterface someClassA = new SomeClassA();

SomeClassB someClassB = (ISomeInterface)someClassA; //InvalidCastException
someClassB.DoExtraStuff(); //What i'm trying to execute  

希望这有意义

不,那不行

假设SomeClassB有一些额外的字段-当您试图从实际引用SomeClassA实例的引用转换为SomeClassB时,您希望它们的值是什么

对象从不更改其在.NET中的类型,并且不能强制转换对不兼容类型的引用


如果你想要一个SomeClassB的实例,你必须创建一个——也许你可以为SomeClassB编写一个构造函数,它需要一个接口来委托给它?

不,那是行不通的

假设SomeClassB有一些额外的字段-当您试图从实际引用SomeClassA实例的引用转换为SomeClassB时,您希望它们的值是什么

对象从不更改其在.NET中的类型,并且不能强制转换对不兼容类型的引用


如果你想要一个SomeClassB的实例,你必须创建一个——也许你可以为SomeClassB编写一个构造函数,它需要一个接口来委托给你?

你不能这样做。您可以将someClassA向上转换为ISomeInterface的基本接口,但它仍然是someClassA;即使将SomeClassA的实例引用为SomeClassB的接口,也不能强制转换它;他们是兄弟姐妹。

你不能那样做。您可以将someClassA向上转换为ISomeInterface的基本接口,但它仍然是someClassA;即使将SomeClassA的实例引用为SomeClassB的接口,也不能强制转换它;他们是兄弟姐妹。

这行不通,你只能向上扔树

你可以说

ISomeInterface someClass = (ISomeInterface)someClassA; 
但是你不能从那里到达B级

您需要有someClassB是someInterface的子级,someClassA是someClassB的子级


可能您真正想要的是它们都实现相同的接口,从而更改您的接口以包括public void DoExtraStuff{…}

这不起作用,您只能向上投射树

你可以说

ISomeInterface someClass = (ISomeInterface)someClassA; 
但是你不能从那里到达B级

您需要有someClassB是someInterface的子级,someClassA是someClassB的子级


可能您真正想要的是它们都实现相同的接口,从而更改您的接口以包括public void DoExtraStuff{…}

如果您想在ClassA的数据上运行该方法,您应该考虑您的体系结构。如果ClassA需要运行ClassB提供的方法,那么它们都应该通过接口或公共基类实现相同的方法

如果您想在ClassA的数据上运行该方法,您应该考虑您的体系结构。如果ClassA需要运行ClassB提供的方法,那么它们都应该通过接口或公共基类实现相同的方法

只能强制转换到类继承或实现的类或接口


因此,SomeClassA可以强制转换为SomeInterface,因为它是从SomeClassA派生的,但不能强制转换为SomeClassB,因为尽管它们共享一个接口,但它们是不同的类,具有可能非常不同的数据。

您只能强制转换为该类继承或实现的类或接口


因此,SomeClassA可以转换为ISomeInterface,因为它是从它派生的,但不能转换为SomeClassB,因为尽管它们共享一个接口,但它们是不同的类,具有可能非常不同的数据。

我的理解是,接口确保类包含某些方法和数据。但是,您可以扩展该接口,并且您的类可以包括其他类型的数据和方法。你不能期望C从你的类中提取相关的信息(可能包含额外的数据),然后将其强制转换到你的新对象中(可能也包含额外的数据)。

我的理解是,接口确保你的类包含某些方法和数据。但是,您可以扩展该接口,并且您的类可以包括其他类型的数据和方法。你不能期望C从你的类中提取相关信息,可能包含额外的数据,然后将其转换到你的新对象中,该对象也可能包含额外的数据。

再次被双向飞碟击败!:-叹气他要禁食。你睡过Jon吗?这不是Skeet,这是他自己写的android复制品。我想这是最好的方法。我想变得懒惰,避免重新初始化所有属性。我希望演员能自动复制。@Jon:我期待着读它,我很难过我不能纠正拼写错误并将blig改为bling。又被飞碟打败了!:-叹气他要禁食。你睡过Jon吗?这不是Skeet,这是他自己写的android复制品。我想这是最好的方法。我想变得懒惰,避免重新初始化所有属性。我希望是ca
sting会自动复制它们。@Jon:我期待着阅读它,我很难过我不能纠正打字错误并将blig更改为bling。为什么你试图在没有该方法的实例上调用方法?某个对象的实例不能变成其他对象:SomeClassA不是SomeClassB,即使两者实现了相同的接口。为什么要尝试在没有该方法的实例上调用方法?某事物的实例不能变成其他事物:SomeClassA不是SomeClassB,即使两者实现相同的接口。