“ClassA c=new ClassB”声明是否可行

本文关键字:声明 是否 ClassB ClassA new | 更新日期: 2023-09-27 18:27:57

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

ClassA c = new ClassB();

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

“ClassA c=new ClassB”声明是否可行

好吧,你可以有类似的东西

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#编程指南)

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

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();

它们是隐式转换。

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

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

ISomeInterface x=new ClassThatImplementsSomeInterface();

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

您的ClassA需要是ClassB的基础。

编辑:

大多数文献都会告诉你,在英语中,推导可以被告知并记为IS,如:

 ClassB *IS* ClassA
 ClassThatImplementsSomeInterface *IS* ISomeInterface

通过这种方式,您的声明/分配是完全正确的。