2

我想知道这在 C# 中是否可行:

ClassA c = new ClassB();

我明白为什么右边部分必须有类名,但左边部分不必有类名(var c = new Anything()),所以我的猜测是有可能在这个不寻常的通过在此表达式的左侧和右侧显式键入不同(可能以某种方式连接)类的名称。我错了吗?

4

3 回答 3

9

那么你可以有类似的东西

public interface ITADA
{
}

public class BaseTADA : ITADA
{
}

public class TADA : BaseTADA
{
}

进而

ITADA t1 = new TADA();
BaseTADA t2 = new TADA();
TADA t3 = new TADA();

这也允许你做

List<ITADA> list = new List<ITADA>() 
        { 
            new TADA(), 
            new BaseTADA()
        };

你应该看看

多态性(C# 编程指南)

于 2013-08-17T08:29:42.427 回答
2

甚至可以通过运算符重载:

class A
{
}

class B
{
    public static implicit operator A(B b)
    {
        return new A();
    }
}

A a = new B();

或者

class A
{
    public static implicit operator A(B b)
    {
        return new A();
    }
}

class B
{
}

A a = new B();

它们是隐式转换

请注意,它们与多态性无关。它们是完全分开的(正交的,而不是相反的!)

于 2013-08-17T08:34:25.867 回答
1

以这种方式声明它的目的与声明它的目的相同

ISomeInterface x=new ClassThatImplementsSomeInterface();

那就是隐藏新类必须提供的所有额外内容,并仅使用接口方法与对象实例“对话”。

ClassA需要成为ClassB.

编辑:

大多数文献会告诉你,推导可以用英语讲述和写成IS,如下所示:

 ClassB *IS* ClassA
 ClassThatImplementsSomeInterface *IS* ISomeInterface

这样,您的声明/分配是完全正确的。

于 2013-08-17T08:34:08.007 回答