“ClassA c=new ClassB”声明是否可行
本文关键字:声明 是否 ClassB ClassA new | 更新日期: 2023-09-27 18:27:57
我想知道这在C#中是否可行:
ClassA c = new ClassB();
我明白为什么右边的部分必须有类名,而左边的部分不必有类名(var c = new Anything()
),所以我的猜测是,通过在这个表达式的左边和右边显式键入不同(可能以某种方式连接)类的名称,可以以这种不寻常的方式创建某个类的实例。我错了吗?
好吧,你可以有类似的东西
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
通过这种方式,您的声明/分配是完全正确的。