一切!我现在面临以下问题。考虑一个方法应该创建新的列表,例如,如果有一些空闲空间,则为 $searched = get_search_query();
$custom_fields = get_post_custom();
foreach($custom_fields as $field_key => $field_values) {
foreach($field_values as $key => $value) {
if (stripos($value, $searched) !== false) {
$in = $value;
$search = $searched;
$replace = '<strong>' . $searched . '</strong>';
$out = str_ireplace($search, $replace, $in);
echo '<p>' . $out . '</p>';
}
}
}
类型的对象,否则返回类型为Room
的列表对象,因此伪代码如下:
RoomConflict
如何创建这样的方法?我是否需要使用public [some type] CreateRooms(){
if(there is some space){
return new List<Room>(){new Room(), new Room()};
}
else{
return new List<RoomConflict>(){new RoomConflict(), new RoomConflict()}
}}
类型的dynamic
。或者也许object
并将null传递给未使用的param。什么解决方案更好?
答案 0 :(得分:1)
如果调用该方法的代码知道将返回什么类,您可以考虑使用泛型。如果没有,您可以使用普通Object
或创建一个包装类,它可以包含两种类型,其中一种类型为null
。
但我认为正确的解决方案是在代码中调用方法,检查方法中的条件,调用返回RoomConfict
的方法或返回{ {1}}。
答案 1 :(得分:1)
Room
和RoomConflict
都实现了一些通用接口吗?换句话说,调用者可以将结果转换为IRoom
并使用返回的对象而不知道它是Room
还是RoomConflict
?如果答案是否定的,那么答案就是不要尝试做你正在做的事情。
当有人调用方法时,他们不需要检查结果以查看它是什么类型。例如,您不希望有人调用该方法,获取结果,然后检查返回的对象是Room
还是RoomConflict
。强类型编程的要点是你不需要这样做。
如果不了解如何使用这些类,我建议只返回可用房间列表(如果有),并且如果没有可用房间,则返回空列表。这样,该方法总是返回List<Room>
,如果没有,那么列表就是空的。
如果RoomConflict
是完全不同的对象,则可能与RoomConflict
处理的任何功能都应该在不同的方法或不同的类中。要学习的最佳实践之一是让每个班级保持一个单一的责任,而不是试图让一个班级或一个方法做不相关的事情。
答案 2 :(得分:0)
根据给定的上下文,我建议在发生冲突时返回null
而不是创建RoomConflict
类..
然后你可以进行null
检查然后处理需要处理的内容
编辑:只是为了使用null
检查来证明斯科特的答案
void BuildHouse()
{
List<Room> rooms = CreateRooms();
foreach (Room room in rooms)
{
if(room != null)
{
//paint room
}
else
{
//expand lot
}
}
}
答案 3 :(得分:0)
您在dynamic
类型object
之间的选择取决于此方法的调用者。
dynamic
将在运行时绑定类型,而object
将执行编译时检查并将返回类型装箱到对象类型(附加操作)。在这两种情况下,调用者都必须评估返回类型以转换返回类型。
答案 4 :(得分:0)
我通常处理这种情况的方式是创建一个包含成功的响应类型,一个成功的值,以及一个不成功的原因。所以对于你的情况,它看起来像这样:
public class RoomRequestResult
{
public bool Success { get; set; }
public Room ResultValue { get; set }
public RoomConflict FailureReason { get; set; }
}
那么你的返回类型将是IEnumerable<RoomRequestResult>
,结果集合的每个元素都是自我描述的。