我想知道是否有可能在AppController和我的应用程序的其他控制器之间添加另一个抽象控制器?
因此我的控制器,例如UsersController扩展了SecureController,SecureController扩展了AppController.
此外,我希望能够让其他控制器直接扩展AppController:SomeNonSecureController扩展AppController.
这是因为我当前的AppController在其beforeFilter中有各种各样的Auth和ACL内容,但我也有不需要安全性的控制器(在所有需要安全性之前,没有添加新的规范)..但是因为一些许多控制器确实需要它,将代码复制粘贴到所有需要的控制器是没有意义的.
我想把所有的beforeFilter安全内容都安装到SecureController中 - 这样任何需要安全性的控制器都会简单地扩展它,而其他控制器直接从AppController继承.
你会如何继续做这样的事情?
谢谢,肯.
我遇到了一个棘手的问题,我似乎无法解决java泛型问题.这有点复杂,但我想不出更简单的场景来说明问题......这里有:
我有一个需要Context的Processor类.有不同类型的Context; 大多数处理器只需要任何抽象的Context,但其他处理器需要特定的子类.像这样:
abstract class AbstractProcessor<C extends Context> {
public abstract void process(C context);
}
class BasicProcessor extends AbstractProcessor<Context> {
@Override
public void process(Context context) {
// ... //
}
}
class SpecificProcessor extends AbstractProcessor<SpecificContext> {
@Override
public void process(SpecificContext context) {
// ... //
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,很酷:处理器可以声明他们需要的Context类型,他们可以假设正确的类型将被传递到process()而不需要强制转换.
现在,我有一个Dispatcher类,它拥有字符串到处理器的映射:
class Dispatcher<C extends Context> {
Map<String, AbstractProcessor<? super C>> processorMap = new HashMap<String, AbstractProcessor<? super C>>();
public void registerProcessor(String name, AbstractProcessor<? super C> processor) {
processorMap.put(name, processor);
}
public void dispatch(String …Run Code Online (Sandbox Code Playgroud) 刚刚在"你使用什么JS lib"民意调查中看到了这个评论
"@Xanti - 是的,是的,编程中的模块化和抽象是一种可怕的做法.调用其他函数的函数?浪费."
这让我很好奇,因为我正在使用Kohana框架为PHP和Jquery库的javascript.
为什么有些人会考虑抽象和模块化的不良做法?是不是为简化和加快开发而制定的框架和库?
这是投票的链接
可能重复:
抽象VS信息隐藏VS封装
有人可以向我解释面向对象编程中封装和抽象原则之间的主要区别(如果可能的话,还有示例).
我正在阅读有关创建图形"抽象层"的信息,以便在图形平台之间切换.不幸的是,我无法找到关于这个主题的更多细节.这种抽象是否可以在功能级别上实现,具有类似的功能?
void pushMatrix(){
if (directx){
// do directx function
}else if (opengl){
// do opengl function
}
}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?有没有更好的办法?有人能指出一些做这个或更多示例代码的事情的例子吗?
在.net中是否有ACL抽象层?我看过一些"最佳实践"文档,但没有很好的基础实现.那么System.Security.AccessControl呢?这是一个很好的起点吗?
ACL应该与存储在DB中的角色以及系统中的角色以及内存中对象定义以及数据库对象或文件一起使用.所以它应该是通用的和/或易于扩展.
这应该依赖于.net框架中的IPrincipal,IIdentity吗?
Zend在他们的PHP框架中有类似的东西,我正在为C#搜索这种东西,而不是移植它(如果已经有标准的解决方案或最佳实践实现).
@ladislav:
它不适用于Web服务,胖客户端或独立应用程序.因此,我正在搜索一个抽象层,可以通过适配器为特定的后端/平台进行扩展.你是对的,我正在为不同类型的对象和正确的定义搜索类似于基于角色的访问管理抽象层.这不应该依赖于您为文件系统中的文件夹设置的ACL.文件系统应该是ACL实现使用的特殊适配器.对我来说,ACL本身就是一个概念,与文件系统无关.文件系统使用ACL概念的实现(即使它在该领域中最为人所知).不希望硬依赖Win32-api.这就是为什么我要求通用(和广泛)使用的通用和抽象(接口)的东西.你知道zend框架中的实现(我知道它是PHP,但这个概念适用于任何应用程序,而不仅仅是基于Web的)?它是抽象的,可以用于代码中的任何对象
我已经使用C++和Java几年了.我似乎无法理解的一件事是,为什么我们需要为类的构造函数提供名称?例如,如果我必须FOO在C++/Java中定义一个类,我将被迫提供FOO构造函数名称.但是,由于构造函数从未被显式调用,编译器的意义在于强迫我为它提供一个名称.
抽象范式决定了,我们隐藏了程序员不必要的细节.这就是原因,构造函数没有返回类型,因为它已经很好地定义了构造函数必须返回的内容.本着同样的精神,为什么我们不能只给所有类的构造函数赋一个通用名称 - 例如任何有意义的东西,比如initialize()或者只是什么都没有,只是参数( [arg [,arg]] )
我希望,我能够表达自己.如果有人有任何确定的答案,请告诉我.
我是Ruby的新手.我正在学习ruby中的抽象原理.我理解过程抽象是隐藏用户的实现细节,或者只是专注于基本要素而忽略细节.
我关心的是如何实现它
1)这是一个简单的函数调用就像这样
# function to sort array
# @params array[Array] to be sort
def my_sort(array)
return array if array.size <= 1
swapped = false
while !swapped
swapped = false
0.upto(array.size-2) do |i|
if array[i] > array[i+1]
array[i], array[i+1] = array[i+1], array[i]
swapped = true
end
end
end
array
end
Run Code Online (Sandbox Code Playgroud)
并且这样打电话
sorted_array = my_sort([12,34,123,43,90,1])
Run Code Online (Sandbox Code Playgroud)
2)数据抽象与封装有何不同
据我所知,Data Abstraction只是隐藏了其他类的一些成员数据.
这是为了简化我在这里提出的问题的一部分:
我想写一些代码,保证在符合特定条件的类型上工作.我们今天要写一些代码:
immutable Example
whatever::ASCIIString
end
function step_one(x::Example)
length(x.whatever)
end
function step_two(x::Int64)
(x * 2.5)::Float64
end
function combine_two_steps{X}(x::X)
middle = step_one(x)
result = step_two(middle)
result
end
x = Example("Hi!")
combine_two_steps(x)
Run Code Online (Sandbox Code Playgroud)
运行此工作:
julia> x = Example("Hi!")
Example("Hi!")
julia> combine_two_steps(x)
7.5
Run Code Online (Sandbox Code Playgroud)
然后另一天我写了更多代码:
immutable TotallyDifferentExample
whatever::Bool
end
function step_one(x::TotallyDifferentExample)
if x.whatever
"Hurray"
else
"Boo"
end
end
function step_two(x::ASCIIString)
(Int64(Char(x[end])) * 1.5)::Float64
end
Run Code Online (Sandbox Code Playgroud)
你知道什么,我的通用组合功能仍然有效!
julia> y = TotallyDifferentExample(false)
TotallyDifferentExample(false)
julia> combine_two_steps(y)
166.5
Run Code Online (Sandbox Code Playgroud)
欢呼!但是,说这是一个深夜,我试图在第三个例子再次这样做.我记得要实施step_one,但我忘了实施step_two!
immutable ForgetfulExample
whatever::Float64
end
function …Run Code Online (Sandbox Code Playgroud) abstraction ×10
java ×3
oop ×3
generics ×2
.net ×1
acl ×1
c# ×1
c++ ×1
cakephp ×1
constructor ×1
controller ×1
directx ×1
interface ×1
julia ×1
opengl ×1
opengl-es ×1
package ×1
ruby ×1
traits ×1
visibility ×1