代码之家  ›  专栏  ›  技术社区  ›  ng.

用c语言扩展抽象类#

  •  1
  • ng.  · 技术社区  · 14 年前

    我是一名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();
    }
    

    所以在上面的层次结构中,C中有一个covarience,它返回一个与a返回的类型兼容的类型。但是,这在visualstudio中给了我一个错误。有没有办法在c#中指定一个covarient返回类型?

    2) 向属性添加setter

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

    这里的编译器抱怨隐藏。有什么建议吗?

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

    2 回复  |  直到 14 年前
        1
  •  0
  •   Mohnkuchenzentrale    14 年前

    不知为什么我不明白你的意图。你为什么不这样解决呢?

    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();
        }
    }
    

    关于你的第二个问题:

    你想做的在我眼里是个坏主意。你可以在两者上使用关键字virtual并忽略警告,但是为什么要这样做呢?

    public abstract class A
    {
        public virtual string Name { get; protected set; }
    
    }
    
    public abstract class B : A
    {
        public virtual string Name { get; set;}
    }
    
        2
  •  0
  •   kvb    14 年前

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

    似乎可以在CLR上按照您的属性示例执行某些操作,但在C#中则不行。在这种情况下,属性基本上由名称、属性类型以及对getter和setter方法(如适用)的引用组成,它们通常被命名为 get_<Property> set_<Property>