当前位置: 首页 > 知识库问答 >
问题:

在抽象类和接口中有相同的字段名可以吗?

百里秋月
2023-03-14

我们有和抽象类一个:

abstract class A {
  public int Id {get; set;}
}

我们有三个实现它的类BCD:

class B : A {
  public List<string> Comments {get; set;}
  public List<string> Categories {get; set;}
}

class C : A {
  public List<string> Categories {get; set;}
}

class D : A {
  public List<string> Comments {get; set;}
}

正如您所看到的,有些属性是常见的,我想将它们提取到另一个类/接口中。因此,理论上我可以创建以下接口:

interface IWithCategories {
  List<string> Categories {get; set;}
}

interface IWithComments {
  List<string> Comments {get; set;}
}

接口IA{int Id{get;set;}}

抽象类A:IA{public int Id{get;set;}}

iWithCommentsiWithCategories将扩展IA:

C类:A,IWithCategories{公共列表类别{get;set;}}

D类:A,{公开列表注释{获取;设置;}}

我知道,在这一点上,类BCD不需要扩展抽象类A,但是它有一些实现可以在所有类之间共享,比如equals、string和一些受保护的方法。

共有1个答案

袁致远
2023-03-14

好吧,为什么接口需要设置器,我假设它们不需要。接口是否需要公开list 而不是ilist ,我认为不需要。然后就有了这些接口定义。

public interface IWithCategories {
  IList<string> Categories { get; }
}

public interface IWithComments {
  IList<string> Comments { get; }
}

现在,如果这些接口是public的,您就不能阻止任何选择这样做的人实现它们。如果将它们保留在内部中,则只有程序集才能使用它们。

如果希望抽象类A实现这些接口,可以将其定义为,

public abstract class A : IWithCategories, IWithComments
{
    abstract public int Id { get; }

    abstract public IList<string> Categories { get; }

    abstract public IList<string> Comments { get; }
}
public class B : A
{
    private readonly int id;
    private readonly List<string> categories;
    private readonly List<string> comments;

    public B(
            int id,
            IEnumerable<string> categories
            IEnumerable<string> comments)
    {
        this.id = id;
        this.categories = (categories ?? Enumerable.Empty<string>()).ToList();
        this.comments = (comments ?? Enumerable.Empty<string>()).ToList();
    }

    public override int Id
    {
        get { return this.id; }
    }

    public override IList<string> Categories
    {
        get { return this.categories; }
    }

    public override IList<string> Comments
    {
        get { return this.comments; }
    }
}
 类似资料:
  • 问题内容: 我发现情况: 问题答案: 您同时满足这两个条件;即。一种实现是同时满足抽象类要求和接口要求。 注意,除非在另一个继承链中使用,否则不需要它。另外,将其移至抽象类定义可能很有意义。

  • 问题内容: 在Java中,您可以创建一个仅包含抽象方法的抽象类。另一方面,您可以创建一个声明相同方法的接口。在这种情况下,可以使用抽象类代替接口吗? 问题答案: 不总是: 一堂课只能延伸 一 堂课 一个类可以实现 多个 接口 Sun文档 进行了更详细的比较: 抽象类与接口 与接口不同,抽象类可以包含非静态和最终字段,并且可以包含已实现的方法。此类抽象类与接口相似,不同之处在于它们提供了部分实现,将

  • 只是延伸问题... 抽象类和接口中的相同方法 假设一个类实现了一个接口并扩展了一个抽象类,两者都有相同的方法(名称签名),但返回类型不同。现在,当我重写方法时,只有当我使返回类型与接口声明相同时,它才会编译。 另外,如果该方法在抽象类或接口中声明为private或final,会发生什么情况? **旁注。在一次采访中,爱因斯坦先生在这个问题上坚持了相当长的时间。有没有一个流行的场景,我们这样做,或者

  • 当我宣布“抽象公共无效显示();”在抽象类测试中,这是创建一个全新的show()方法,还是只引用Inter接口中声明的show()方法?请澄清。

  • 本文向大家介绍Java中接口和抽象类的区别与相同之处,包括了Java中接口和抽象类的区别与相同之处的使用技巧和注意事项,需要的朋友参考一下 1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽。.抽象类是对整个类整体进行抽象,包括属性、行为。Java抽象类和Java接口一样,都用来声明一个新的类型。并且作为一个类型的等级结构的起点。 (2).格式: (3).说明: A:抽象类中不一定有

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗