代码之家  ›  专栏  ›  技术社区  ›  vidalsasoon

将接口转换为备用基类?

  •  1
  • vidalsasoon  · 技术社区  · 14 年前

    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  
    

    希望这有意义。。。

    6 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    不,那不行。

    假设 SomeClassB 有一些额外的字段-当您试图从 事实上 SomeClassA 一些B类

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

    如果你想要一个 ,您必须创建一个-也许您可以为 一些B类 ISomeInterface 委派给?

        2
  •  1
  •   Hogan    14 年前

    这不行,你只能把树扔了。

    你可以说

    ISomeInterface someClass = (ISomeInterface)someClassA; 
    

    你需要有一个接口的孩子和一个接口的孩子

    public void DoExtraStuff() {...}

        3
  •  1
  •   Jackson Pope    14 年前

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

    所以 SomeClassA ISomeInterface 因为它源于它,但不是为了 SomeClassB 因为尽管它们共享一个接口,但它们是不同的类(可能有非常不同的数据)。

        4
  •  0
  •   Paul Sonier    14 年前

        5
  •  0
  •   Ryan Bennett    14 年前

    如果你想在ClassA的数据上运行这个方法,你应该考虑一下你的架构。如果class a需要运行ClassB提供的方法,那么它们应该通过接口或公共基类实现相同的方法。

        6
  •  0
  •   Giawa    14 年前

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