Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c语言中扩展抽象类#_C#_Java - Fatal编程技术网

C# 在c语言中扩展抽象类#

C# 在c语言中扩展抽象类#,c#,java,C#,Java,我是一名Java开发人员,我注意到c#与Java在扩展抽象类方面存在一些差异。我想知道一个c#开发者是如何做到以下几点的 1) 共变性 public abstract class A { public abstract List<B> List(); } public class BList : List<B> { } public abstract class C : A { public abstract BList List(); } 这里编译器抱怨

我是一名Java开发人员,我注意到c#与Java在扩展抽象类方面存在一些差异。我想知道一个c#开发者是如何做到以下几点的

1) 共变性

public abstract class A {
   public abstract List<B> List();
}
public class BList : List<B> {
}
public abstract class C : A { 
   public abstract BList List();
}
这里编译器抱怨隐藏。有什么建议吗


请不要建议使用接口,除非这是唯一的方法。

不知何故,我不理解您的意图。你为什么不这样解决呢

public class BList : List<T> where T : B {} same =  public class BList : List<B> {}

public class C : A
{
    public override List<B> Liste()
    {
        return new BList();
    }
}
public abstract class A
{
    public virtual string Name { get; protected set; }

}

public abstract class B : A
{
    public virtual string Name { get; set;}
}

C#中都不支持这两个选项。在基础运行时(CLR)中也不支持协变返回


似乎可以在CLR上按照您的属性示例执行某些操作,但在C#中则不行。在后台,属性基本上由名称、属性类型以及对getter和setter方法(如适用)的引用组成,它们通常被命名为
get
set
(但在不符合CLS的类中不需要遵循该约定)。可以在只有一个getter的基类中创建一个属性,然后在派生类中创建另一个具有相同名称和getter的属性,但它有自己的setter。然而,我不知道任何.NET语言都允许这样的定义。

您对我的第一个问题的回答是不一致的。至于第二个问题,这并不令人满意。我需要两个独立的类型,我希望A-to和B没有依赖项。B是否需要一个额外的setter方法并不重要。在重写虚拟方法时,C不支持返回类型协方差,抱歉!甚至没有添加属性设置器,我还以为属性是add set_uuu_uu_uu方法的语法糖?@ng:在CLR级别上,它们实际上是,但它们在更高级的语言中得到了一些特殊的处理。这是一种限制您的情况。
public abstract class A
{
    public virtual string Name { get; protected set; }

}

public abstract class B : A
{
    public virtual string Name { get; set;}
}