在这个简单的案例中,什么是好的设计:
假设我有一个基类Car,其中一种方法FillTank(Fuel fuel),燃料也是一个基类,有几个叶类,柴油,乙醇等.
在我的叶子车类上DieselCar.FillTank(Fuel fuel)只允许某种类型的燃料(没有意外:)).现在这是我的关注,根据我的界面,每辆车都可以装满任何燃料,但这对我来说似乎不对,在每次FillTank()实施中检查输入燃料的正确类型,如果没有抛出错误或其他什么.
我怎样才能将这种情况重新设计为更准确的情况,甚至可能吗?如何设计一个基本方法,在没有得到这些"奇怪结果"的情况下输入基类?
假设我有以下类结构:
class Car;
class FooCar : public Car;
class BarCar : public Car;
class Engine;
class FooEngine : public Engine;
class BarEngine : public Engine;
Run Code Online (Sandbox Code Playgroud)
我们也给它Car一个句柄Engine.FooCar将使用a创建A ,FooEngine*并使用a BarCar创建BarEngine*.有没有办法安排事情,所以一个FooCar对象可以调用成员函数而FooEngine无需向下转换?
这就是为什么类结构按照现在的方式布局的原因:
Car都有Engine.此外,一个FooCar只会使用一个FooEngine.Engine,我宁愿不复制和粘贴.Engine了解它的函数Car.一旦我dynamic_cast在编写这段代码时输入,我就知道我可能做错了什么.有一个更好的方法吗?
更新:
根据目前给出的答案,我倾向于两种可能性:
Car提供一个纯虚getEngine()函数.这将允许FooCar并BarCar具有返回正确类型的实现Engine.Engine功能吸收到 …说我有一个属性的汽车类make和registration,我创建一个ArrayList来存储它们.如何显示ArrayList中的所有元素?
我现在有这个代码:
public Car getAll()
{
for(int i = 0; i < cars.size(); i++) //cars name of arraylist
{
Car car = cars.get(i);
{
return cars.get (i);
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好但是当我在我的测试器类中使用以下代码进行尝试时:
private static void getAll(Car c1)
{
ArrayList <Car> cars = c1.getAll(); // error incompatible type
for(Car item : cars)
{
System.out.println(item.getMake()
+ " "
+ item.getReg()
);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到了不兼容类型的错误.我的编码是否正确?如果没有,有人可以告诉我它应该如何?
谢谢
我有很多.txt文件.我想连接这些并生成一个文本文件.我怎么在java中做到这一点?以下是这种情况
file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)
连接结果
file3.txt
Run Code Online (Sandbox Code Playgroud)
这样file1.txt就遵循 了内容file2.txt
(抱歉新手问题.)在Ruby中,循环之间有什么区别:
@cars.each do |car|
Run Code Online (Sandbox Code Playgroud)
和
for car in @cars do
Run Code Online (Sandbox Code Playgroud)
?
效率是否存在差异,或者为什么我们需要两种(或更多)方式来表达同样的事情?第二种方式对我来说似乎更优雅/自然,但我可能会错过一些重要的观察,为什么第一种可能是更好的选择.
除了明确清晰,我们为什么要坚持:
car.getSpeed()和car.setSpeed(55)
当这可以作为很好:
car.speed()和car.speed(55)
我知道get()和set()对于通过将所有内容保存在一个地方来保持对数据成员的任何更改都是有用的.
另外,显然,我理解car.speed()并且car.speed(55)是相同的功能,这使得这个错误,但是在PHP和Zend Framework中,相同的操作用于GET,POST和回发.
在VB和C#有"属性",和许多被使用,多少我听说纯粹主义者的厌恶,并有东西在类似于Ruby,5.times和.each,.to_i等
你有操作符重载,多重继承,虚拟函数C++,某些组合可以驱使任何人坚果.
我的意思是说,有太多的范例和方法可以完成任务,似乎没有人尝试过我提到的特定组合.
至于我,我的理由是阅读代码简短而清晰.
我错了,稍微错了,这只是奇怪的,所以不使用,或者还有什么?
如果我仍然决定保持正确,我可以使用car.speed()和car.setSpeed(55).
这有什么不对(只是省略"获取")?
谢谢你的任何解释.
我更喜欢使用局部变量而不是多次调用同一个方法.
/*
* I prefer this
*/
Vehicle vehicle = person.getVehicle()
if (vehicle instanceof Car) {
Car car = (Car) vehicle;
car.openSunroof();
} else if (vehicle instanceof Bike) {
Bike bike = (Bike) vehicle;
bike.foldKickstand();
}
/*
* Rather than this
*/
if (person.getVehicle() instanceof Car) {
Car car = (Car) person.getVehicle();
car.openSunroof();
} else if (person.getVehicle() instanceof Bike) {
Bike bike = (Bike) person.getVehicle();
bike.foldKickstand();
}
Run Code Online (Sandbox Code Playgroud)
你更喜欢哪个?为什么?
我需要创建某种类型的对象.对象的类只有一个构造函数(我写的一个).
我的程序接收创建具有参数ID的对象实例的请求.如果ID参数包含不是数字的char,我想停止构造函数.
我之前无法检查参数,因为我不是调用构造函数的人.
我将尝试在一个简单的例子中提出我的问题......
假设我有一个抽象的基类Car.Car有一个基本的Engine对象.我在抽象Car类中有一个方法StartEngine(),它将引擎的起始委托给Engine对象.
如何允许Car的子类(如法拉利)将Engine对象声明为特定类型的引擎(例如,TurboEngine)?我需要另一个Car class(TurboCar)吗?
我正在继承一个普通的旧Engine对象,我不能在我的Car子类中重新声明(或覆盖)它作为TurboEngine.
编辑: 我知道我可以在我的法拉利课程中将任何Engine的子类插入myEngine参考中...但是我怎样才能调用只有TurboEngine暴露的方法?因为myEngine是作为基础引擎继承的,所以没有包含任何turbo内容.
谢谢!
car-analogy ×6
java ×5
oop ×4
inheritance ×2
arraylist ×1
c++ ×1
coding-style ×1
composition ×1
constructor ×1
dynamic-cast ×1
getter ×1
ooad ×1
ruby ×1
setter ×1
testng ×1