有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java类只是为了语义

我正在构建一个应用程序,允许您将样式应用于正则表达式及其捕获组。我有一个名为RegexGroup的类,它包含RegexGroupRegex的列表

为了利用这些类,我将制作一个gui前端,我从制作一个可序列化的项目类开始,但我意识到Project类与RegexGroup类完全相同。仅仅因为它们将在不同的上下文中使用,创建一个与另一个完全相同的Project类是好的还是坏的做法?或者我应该坚持使用RegexGroup类吗? 先谢谢你,呃

注意:我想不出标题,如果“语义”一词的用法不正确,请纠正我

注:我目前在java中编写这个,但是这是不是在C++中恰当地使用^ {CD8>}?p>

编辑:这些类实际上是完全相同的。它们的实现和接口完全相同,没有任何区别


共 (4) 个答案

  1. # 1 楼答案

    任何有助于代码可读性的东西都应该有帮助(如果它不损害其他重要特性,比如性能)。因此,创建另一个类(或者,出于这个原因,对存在的类进行别名)是可以的

    我想在Java中,您可以从RegexGroup中对项目进行子类化,然后将项目主体留空

    是的,在C++中,你可以使用Type。或者您不能:实现取决于您是否希望在尝试将RegexGroup传递给expexts项目的函数时获得编译器错误

  2. # 2 楼答案

    如果类在不同的上下文中使用,我肯定会创建一个单独的类。特别是,我将避免通过继承(实现继承)重复使用,因为以下场景:

    class Regex { ... };
    class RegexGroup
    {
        public void add ( Regex pattern ) { ... }
        public void add ( RegexGroup group ) { ... }
    }
    
    class Project extends RegexGroup { ... }
    
    // later on.
    Project project = ...;
    RegexGroup group = ...;
    group.add(project);
    

    如果最后一行对您的应用程序没有意义,那么它违反了Liskov Substitution Principle,应该避免继承

    根据我的理解,在我看来,自然结构是:“每个项目都有一个根正则表达式组”。如果这是正确的,那么您的项目可能具有以下外观:

    class Project
    {
        private RegexGroup rootGroup;
        public void add ( Regex pattern )
        {
            this.rootGroup.add(pattern);
        }
        public void add ( RegexGroup group )
        {
            this.rootGroup.add(group);
        }
    }
    

    这需要一些额外的代码来转发调用,但可能最自然地对应用程序结构进行建模

  3. # 3 楼答案

    如果项目实际上是RegexGroup。然后你就可以从中得到
    这很有道理,如果你说某件事是另一件事,那么这就是你从中得到的

    class Project: public RegexGroup { }
    

    当然,在这个过程中,您可能会发现一些细微的差异,您可以向单独的类添加内容,甚至为这两个类创建一个基类

    是的,在C++中,您可以使用^ {CD1>}来声明另一个别名到同一类型。

    typedef RegexGroup Project;
    
  4. # 4 楼答案

    如果我正确地理解了这个问题,我认为如果您对RegexGroup进行子类化,为同一个类赋予另一个名称(如果这对您有效的话),那将是非常好的。在类定义中,可以看到它是RegexGroup的一个子类,因此这不是信息隐藏。如果你迟早会意识到有一点不同,你甚至可以把它添加到子类中