相关疑难解决方法(0)

何时进行子类而不是区分行为

我难以决定何时应该进行子类化而不是仅添加表示类的不同模式的实例变量,然后让类的方法根据所选模式进行操作.

例如,假设我有一个基础车类.在我的计划中,我会处理三种不同类型的汽车.赛车,公共汽车家庭模型.每个人都有自己的齿轮实现,如何转动和座椅设置.我应该将我的汽车继承到三个不同的车型,还是应该创建一个类型变量并使齿轮,车削和座椅通用,以便它们根据所选择的车型而有所不同?

在我目前的情况下,我正在开发一款游戏,而且我已经意识到它开始变得有点混乱,所以我会询问有关可能重构我当前代码的建议.基本上有不同的地图,每个地图可以是三种模式之一.根据地图定义的模式,将会有不同的行为,地图将以不同的方式构建.在一种模式中,我可能必须在超时基础上向玩家和产生生物的租金,其中另一个玩家负责产生生物,而在另一个模式中可能有一些自动生成的生物与玩家产生的生物和建造建筑物的玩家.所以我想知道是否最好有一个基本地图类,然后将其子类化为每个不同的模式,或者是否继续沿着当前添加差异化行为的路径,具体取决于地图类型变量设置为.

c# oop

9
推荐指数
1
解决办法
3057
查看次数

直觉与设计原则

我有这样的类层次结构Beverage -> Coffee-> Latte.哪里Beverageabstract超被延长Coffee.Coffee然后类增加了一些行为,但也是abstract.Latte扩展Coffee类,是一个具体的类.我已经使用继承来添加行为.并且继承确实有缺点,如超类方法的可见性,使代码易碎,代码紧密耦合.因此,编程原则Composition应该优先考虑Inheritance.但在这种情况下inheritance感觉如此自然Latte,Coffee并且Coffee是一种类型的Beverage使用composition添加行为感觉错误,尽管它的好处.所以这里的问题是 应该直觉覆盖设计原则吗?

饮料:

public abstract class Beverage {

    private final String name;
    private final double price;

    Beverage(String name, double price){
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }
    public double getPrice() {
        return price;
    }

    public abstract void …
Run Code Online (Sandbox Code Playgroud)

java inheritance design-patterns composition

9
推荐指数
1
解决办法
209
查看次数

"是一个"vs"有一个":哪一个更好?

投资组合A→基金1

投资组合A→基金2

投资组合A→基金3

如果不使用is/has,我无法构建句子.但在1和2之间,

1)有一个:

class PortfolioA
{
    List<Fund> obj;
}
Run Code Online (Sandbox Code Playgroud)

2)是:

class PortfolioA : List<Fund>
{

}
Run Code Online (Sandbox Code Playgroud)

从可扩展性,可用性的角度来看,您认为哪一个更好?我仍然可以通过任何方式访问我的资金,尽管有一个小的语法变化.

oop inheritance composition

8
推荐指数
3
解决办法
8865
查看次数

Java:当其他类已经扩展基类时,如何扩展基类?

我想在apache commons电子邮件中扩展一个基类,基类是Email.我只是想为.send()方法添加一些限制

其他3个类扩展Email:HtmlEmail,SimpleEmail和MultiPartEmail

没有工厂方法来创建这3个派生类.

有没有一种最好的方法可以从基础电子邮件类扩展这一方法?我能想到的是扩展3个派生类,在每个派生类中重写.send(),并让它们中的每一个调用一个通用的静态方法来完成.send()限制功能.

java oop

8
推荐指数
1
解决办法
1082
查看次数

无法将构造函数定义为protected或private!为什么?

--- A.php ----
require_once 'B.php';

class A
{
    public function __constructor($x){...}

    public function foo()
    {
        $b = B::getInstance();
        ...
    }
}

--- B.php ----
require_once 'A.php';

class B extends A
{
    protected static $_instance = null;

    protected function __construct(){}

    public static function getInstance()
    {....}
}
Run Code Online (Sandbox Code Playgroud)

PHP只是在到达行时就停止解释代码

protected function __construct(){}
Run Code Online (Sandbox Code Playgroud)

并输出之前的所有内容以及之后未发送给浏览器的任何内容.

只要我把这条线取出来,就改成它

// protected function __construct(){}
Run Code Online (Sandbox Code Playgroud)

一切正常!?

我不明白.

有任何想法吗?

php

8
推荐指数
2
解决办法
1万
查看次数

C++ Singleton类 - 继承良好实践

在现有项目中,我将继承一个声明为Singleton的Controller类(MVC),以便定义我自己的处理.如何恰当地推导出这个Singleton类?

首先,我扩展了上下文并需要这种继承.

我添加到现有软件的应用程序想要使用MVC模块,该模块执行与我愿意执行的任务几乎相同的任务.它使用相同的方法签名和稍作修改.重写我自己的MVC模块肯定会重复代码.现有模块本质上面向其应用于软件的另一部分,我不能简单地使用相同的模块.但是它被编写为模型 - 视图 - 控制器模式,其中Controller是Singleton.我已经得到了View.

其次,我怀疑我可以经典推导出Singleton类.

从继承类调用构造函数只会为父类调用getinstance(),并且无法从派生类(?)返回对象.

第三,我是如何看待某种方式来处理的.请评论/帮助我改进!

我在一个可以调用AbstractController的类中复制了整个Singleton类.我两次推出这个课程.第一个孩子是单身,采用父母阶级的整体治疗.第二个孩子是我应用程序的控制器,具有自己重新定义的处理.

谢谢!

c++ oop inheritance singleton design-patterns

8
推荐指数
2
解决办法
2万
查看次数

制作JFrame和Observable对象

我有一个类,比方说MyJFrame我代表我的应用程序的GUI.它实现了接口Observer并覆盖了该方法update.

public class MyJFrame extends JFrame implements Observer{
  ...
  public void update(Observable arg0, Object arg1){
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想让我的JFram成为一个Observable对象,但我不能,因为它已经扩展了类JFrame.我试图在我的类中创建一个Observable类型的变量.

public class MyJFrame extends JFrame implements Observer{
  Observable observable = new Observable();
Run Code Online (Sandbox Code Playgroud)

这里的问题是我可以将Observer添加到这个可观察字段,我也可以通知观察者但是我不能调用该方法setChanghed()(因为它被声明为protected),必须在通知之前调用它.

你对我能实现它有什么想法吗?

谢谢!!

java swing observable observer-pattern

7
推荐指数
2
解决办法
6058
查看次数

使实体类关闭以进行更改

我有一个数据库关系,如下所示.域对象是基于LINQ to SQL ORM创建的.

付款包括现金付款和礼品券付款.假设购买总额为550.可以按以下组件支付

1 Gift Coupon Valued 300

1 Gift Coupon Valued 200

I Cash Currency Valued 50
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我正在使用ORM的"InsertOnSubmit"功能插入新的付款记录.以下代码工作正常.但是,如果我公司使用信用卡引入新的支付组件,我需要更改我的"付款"域类.如何使支付类打开以进行扩展并关闭仍在使用ORM的更改

注意:Payment类具有行为(例如GetTotalAmountCollected).我正在努力使"付款"类满足OCP.

注意:优惠券类型有特定的行为.优惠券发行日期是否小于2000年1月1日,它不应用于计算总金额(即,CouponValue应为零).请参阅使用策略模式重构代码.

注意:我使用的是.Net 4.0

参考:

  1. 将ObjectContext.AddObject与Entity Framework一起使用时出错
  2. 使用策略模式重构代码
  3. 喜欢构成而不是继承?
  4. 代码优先与模型/数据库优先
  5. 使用Unity的策略模式和依赖注入
  6. 委托与OOP的C#策略设计模式
  7. 如何在C#中使用策略模式?
  8. 继承与EF代码第一:第2部分-每个类型表(TPT) http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first -ctp5部分-2-表每类型tpt.aspx

C#代码:

public class PaymentAppService
{
    public RepositoryLayer.ILijosPaymentRepository Repository { get; set; }

    public void MakePayment()
    {
        DBML_Project.Payment paymentEntity = new DBML_Project.Payment();
        paymentEntity.PaymentID = 1;
        paymentEntity.PaymentType = "PurchaseP";

        DBML_Project.CashPayment cashObj = new …
Run Code Online (Sandbox Code Playgroud)

.net c# domain-driven-design entity-framework linq-to-sql

7
推荐指数
1
解决办法
851
查看次数

使用Composition为"is - a"关系的问题

我有为HR系统开发的系统.有会计员工和程序员员工.在加入公司的第一个月,员工没有任何角色.一名员工可以同时是会计师和程序员.我有一个由以下代码显示的设计.

现在,我需要通过实现新功能来增强系统:

终止所有会计师.(终止表示将员工的状态设置为IsActive = false).问题是我不能在没有检查的情况下将所有会计师直接设置为非活动状态.我需要检查一下他是否还有其他角色.

如何重新构造这些类以使终止函数更自然OO?

UPDATE

我正在寻找一个有@AlexDev答案的EF Database First解决方案模型和数据库架构的答案.

C#代码

List<Accountant> allAccountants =  Get All accountants from database

public class Employee
{
    public int EmpID { get; set; }
    public DateTime JoinedDate { get; set; }
    public int Salary { get; set; }
    public bool IsActive { get; set; }
}


public class Accountant : Employee
{
    public Employee EmployeeData { get; set; }
}

public class Programmer : Employee
{
    public Employee EmployeeData { get; set; }
} …
Run Code Online (Sandbox Code Playgroud)

c# oop ooad domain-driven-design solid-principles

7
推荐指数
1
解决办法
440
查看次数

TypeScript中的多类继承

有什么方法可以解决只允许扩展至多一个其他类的问题.

class Bar {

  doBarThings() {
    //...
  }

}

class Bazz {

  doBazzThings() {
    //...
  }

}

class Foo extends Bar, Bazz {

  doBarThings() {
    super.doBarThings();
    //...
  }

}
Run Code Online (Sandbox Code Playgroud)

目前这是不可能的,TypeScript会给出错误.可以通过使用接口来克服其他语言中的这个问题,但是在TypeScript中无法解决问题.

欢迎提出建议!

javascript inheritance interface class typescript

7
推荐指数
1
解决办法
9232
查看次数