我确信这一定是重复的,但我找不到答案:
如果我有两个班级:
public class BASE
{
public BASE() {};
public abstract BASE clone();
}
public class CHILD : BASE
{
public CHILD() : base() {}
public override BASE clone()
{
return new CHILD();
}
}
每次我想要克隆CHILD类型的对象时,我必须进行显式转换,如:
var a = new CHILD();
CHILD b = a.clone() as CHILD;
有没有办法避免这种转换? 我希望能够写下:
var original = new CHILD();
BASE copy1 = original.clone();
CHILD copy2 = original.clone();
这在C#中是否可行?
答案 0 :(得分:3)
有没有办法避免这种转换?
不是通过重载Assembly assembly = Assembly.Load(File.ReadAllBytes(Environment.CurrentDirectory + @"\mainForm.dll"));
Type type = assembly.GetType("mainForm");
object form = Activator.CreateInstance(type);
type.InvokeMember("ShowDialog", BindingFlags.Default | BindingFlags.InvokeMethod, null, form, null);
- 只是通过更改其返回类型来重载方法。改为使用不同的方法:
Clone
如果要在所有继承的类上强制执行该行为,可以使public class CHILD : BASE
{
public CHILD() : base() {}
public BASE clone() { return this.cloneChild();}
public CHILD cloneChild()
{
return new CHILD();
}
}
通用:
BASE
答案 1 :(得分:1)
如果body:after {
content: '';
position: fixed;
top: -50%;
right: -50%;
bottom: -50%;
left: -50%;
z-index: -1;
background: #000000;
}
中需要CHILD
类型而不是BASE
类型,则需要执行方法隐藏而不是方法覆盖< / em>的。您应该删除clone
关键字并改为使用override
:
new
答案 2 :(得分:0)
C#不支持返回类型协方差。您可以尝试此解决方法(使用泛型):
public class Base<T> {
public abstract T Clone()
}
public class Child : Base<Child> {
public override Child Clone() {
return ...;
}
}