寻找具有派生返回类型

时间:2016-05-12 13:48:55

标签: c# abstract icloneable

我确信这一定是重复的,但我找不到答案:

如果我有两个班级:

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#中是否可行?

3 个答案:

答案 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 ...;
    }
}