我想知道这在C#中是否可行:
ClassA c = new ClassB();
我明白为什么正确的部分必须有类名,但是左边的部分不必有类名(var c = new Anything()
),所以我的猜测是可以创建通过在此表达式的左侧和右侧显式键入不同(可能已连接的某种方式)类的名称,以这种不寻常的方式实现某个类的实例。我错了吗?
答案 0 :(得分: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()
};
你应该看看
答案 1 :(得分: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();
请注意,它们与多态无关。它们是完全分开的(正交,而不是相反!)
答案 2 :(得分:1)
以这种方式声明它的目的与使用
声明它的目的相同ISomeInterface x=new ClassThatImplementsSomeInterface();
这就是隐藏新类必须提供的所有额外内容,并仅使用接口方法与对象实例“对话”。
您的ClassA
必须以ClassB
为基础。
编辑:
大多数文献都会告诉你,推导可以用英语告诉并写成 IS ,如:
ClassB *IS* ClassA
ClassThatImplementsSomeInterface *IS* ISomeInterface
以这种方式,您的声明/作业是完全正确的。