使用OOP Javascript的用户,主持人和管理员

时间:2018-10-02 19:00:07

标签: javascript oop

挑战

对于这个挑战,您将构建一个模拟评论部分。 设计

我们将集中在两个方面: 用户

Users come in 3 flavors, normal users, moderators, and admins. Normal users can only create new comments, and edit the their own comments. Moderators have the added ability to delete comments (to remove trolls), while admins have the ability to edit or delete any comment.
Users can log in and out, and we track when they last logged in

评论

Comments are simply a message, a timestamp, and the author.
Comments can also be a reply, so we'll store what the parent comment was.

下面是我的代码:

class Admin extends Moderator {
  constructor(name) {
    super(name);
  }
  canEdit(comment) {
    return true;
  }
}

class Comment {
  constructor(author, message, repliedTo) {
    this.createdAt = new Date();
    this._author = author;
    this._message = message;
    this.repliedTo = repliedTo || null;
  }
  getMessage() {
    return this._message;
  }
  setMessage(message) {
    this._message = message;
  }
  getCreatedAt() {
    return this.createdAt;
  }
  getAuthor() {
    return this._author;
  }
  getRepliedTo() {
    return this.repliedTo;
  }
  getString(comment) {
    const authorName = comment.getAuthor().getName();
    if (!comment.getRepliedTo()) return authorName;
    return `${comment.getMessage()} by ${authorName} (replied to ${this.getString(comment.getRepliedTo())})`;
  }
  toString() {
    const authorName = this.getAuthor().getName();
    if (!this.getRepliedTo()) {
      return `${this._message} by ${authorName}`;
    }
    return this.getString(this);
  }
}

我收到错误消息“ toString方法应返回正确的层次结构(嵌套答复)” 有人可以帮忙吗

5 个答案:

答案 0 :(得分:4)

尽管这应该是一项任务,但是question有点技术性和不清楚;这是行之有效的解决方案

class User {
  constructor(name) {
   this._name = name;
   this._loggedIn = false;
   this._lastLoggedInAt = null;
  }
  isLoggedIn() {
    return this._loggedIn;
  }
  getLastLoggedInAt() {
    return this._lastLoggedInAt;
  }
  logIn() {
    this._lastLoggedInAt = new Date();
    this._loggedIn = true;
  }
  logOut() {
    this._loggedIn = false
  }
  getName() {
    return this._name;
  }
  setName(name) {
    this._name = name;
  }
  canEdit(comment) {
    if(comment._author._name === this._name) {
      return true;
    }
    return false;
  }
  canDelete(comment) {
    return false;
  }
}

class Moderator extends User {
   constructor(name) {
     super(name);
   }
   canDelete(comment) {
     return true;
   }
}

class Admin extends Moderator {
  constructor(name) {
    super(name)
  }
  canEdit(comment) {
    return true;
  }
}

class Comment {
   constructor(author = null, message, repliedTo = null) {
     this._createdAt = new Date();
     this._message = message;
     this._repliedTo = repliedTo;
     this._author = author;
   }
   getMessage() {
     return this._message;
   }
   setMessage(message) {
     this._message = message;
   }
   getCreatedAt() {
     return this._createdAt;
   }
   getAuthor() {
     return this._author;
   }
   getRepliedTo() {
     return this._repliedTo;
   }
   toString() {
     if(this._repliedTo === null) {
        return this._message + " by " + this._author._name
     }
     return this._message + " by " + this._author._name + " (replied to " + 
          this._repliedTo._author._name + ")"
   }
 }

错误是因为您在getName()方法上调用了getAuthor方法,该方法不可用。您可以直接从评论this._author._name获取作者姓名。

答案 1 :(得分:0)

我使用JavaScript构造函数的编码样式来编写此解决方案,但是没关系,因为该解决方案不需要您更改样式。请注意,字段(_author,_message,_repliedTo)是私有的,私有字段只能通过公共方法访问。这基本上就是我在toString()方法中所做的。

private class Data(val a: Int, val b: Int, val c: Int)

@JvmStatic
fun main(args: Array<String>) {
    val dataList = listOf(Data(1, 2, 3), Data(4, 5, 6), Data(7, 8, 9), Data(1, 10, 11))
    val result = mutableMapOf<Int, MutableMap<Int, Int>>()
    for (data in dataList) {
        val aMap = result.getOrPut(data.a) { mutableMapOf() }
        aMap[data.b] = data.c
    }
    println(result)
}

答案 2 :(得分:0)

您可以删除getString()方法...

toString() 
{
    return ((this._repliedTo === null) ? this._message + " by " + 
           this._author.getName() : this._message + " by " + 
           this._author.getName() + " (replied to " + this._repliedTo._author.getName() + ")");
}

答案 3 :(得分:0)

class User {
  function __construct($name) {
   private $name;
   private $loggedIn;
   private $lastLoggedInAt;

   $this->name = $name;
   $this->loggedIn = false;
   $this->lastLoggedInAt = null;
  }
  function isLoggedIn() {
    return $this->loggedIn;
  }
  function getLastLoggedInAt() {
    return $this->lastLoggedInAt;
  }
  function logIn() {
    $this->lastLoggedInAt = new Date('Y-m-d H:i:s');
    $this->loggedIn = true;
  }
  function logOut() {
    $this->loggedIn = false;
  }
  function getName() {
    return $this->name;
  }
  function setName($name) {
    $this->name = $name;
  }
  function canEdit($comment) {
    if($comment->author->name === $this->name) {
      return true;
    }
    return false;
  }
  function canDelete($comment) {
    return false;
  }
}

class Moderator extends User {
   function __construct($name) {
     $this->name = $name;
   }
   function canDelete($comment) {
     return true;
   }
}

class Admin extends Moderator {
  function constructor($name) {
    $this->name = $name;
  }
  function canEdit($comment) {
    return true;
  }
}

class Comment {
   function __construct($author = null, $message, $repliedTo = null) {

    private $createdAt;
    private $message;
    private $repliedTo;
    private $author;

     $this->createdAt = new Date('Y-m-d H:i:s');
     $this->message = $message;
     $this->repliedTo = $repliedTo;
     $this->author = $author;
   }
   function getMessage() {
     return $this->message;
   }
   function setMessage($message) {
     $this->message = $message;
   }
   function getCreatedAt() {
     return $this->createdAt;
   }
   function getAuthor() {
     return $this->author;
   }
   function getRepliedTo() {
     return $this->repliedTo;
   }
   function __toString() {
     if($this->repliedTo === null) {
        return $this->message + " by " + $this->author->name;
     }
     return $this->message + " by " + $this->author->name + " (replied to " + 
          $this->repliedTo->author->name + ")";
   }
 }

答案 4 :(得分:0)

  constructor(name) {
   this._name = name;
   this._loggedIn = false;
   this._lastLoggedInAt = null;
  }
  isLoggedIn() {
    return this._loggedIn;
  }
  getLastLoggedInAt() {
    return this._lastLoggedInAt;
  }
  logIn() {
    this._lastLoggedInAt = new Date();
    this._loggedIn = true;
  }
  logOut() {
    this._loggedIn = false
  }
  getName() {
    return this._name;
  }
  setName(name) {
    this._name = name;
  }
  canEdit(comment) {
    if(comment._author._name === this._name) {
      return true;
    }
    return false;
  }
  canDelete(comment) {
    return false;
  }
}

class Moderator extends User {
   constructor(name) {
     super(name);
   }
   canDelete(comment) {
     return true;
   }
}

class Admin extends Moderator {
  constructor(name) {
    super(name)
  }
  canEdit(comment) {
    return true;
  }
}

class Comment {
   constructor(author = null, message, repliedTo = null) {
     this._createdAt = new Date();
     this._message = message;
     this._repliedTo = repliedTo;
     this._author = author;
   }
   getMessage() {
     return this._message;
   }
   setMessage(message) {
     this._message = message;
   }
   getCreatedAt() {
     return this._createdAt;
   }
   getAuthor() {
     return this._author;
   }
   getRepliedTo() {
     return this._repliedTo;
   }
   toString() {
     if(this._repliedTo === null) {
        return this._message + " by " + this._author._name
     }
     return this._message + " by " + this._author._name + " (replied to " + 
          this._repliedTo._author._name + ")"
   }
 }