特质的自我类型A
:
trait B
trait A { this: B => }
Run Code Online (Sandbox Code Playgroud)
说" A
不能混合成一个不会扩展的具体类B
".
另一方面,以下内容:
trait B
trait A extends B
Run Code Online (Sandbox Code Playgroud)
说"混合的任何(混凝土或抽象)类A
也将在B中混合".
这两个陈述不是同一个意思吗?自我类型似乎只是为了创建一个简单的编译时错误的可能性.
我错过了什么?
场景:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A;
function calc($v) {
$v++;
return A::calc($v);
}
}
print (new MyClass())->calc(2); // should print 4
Run Code Online (Sandbox Code Playgroud)
这段代码不起作用,我找不到像继承那样调用特征函数的方法.我试着打电话self::calc($v)
,static::calc($v)
和parent::calc($v)
,A::calc($v)
以及以下内容:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
Run Code Online (Sandbox Code Playgroud)
什么都行不通.
有没有办法使它工作或必须完全覆盖比这复杂得多的特征函数:)
我最近一直在努力研究PHP,我发现自己陷入了特质.我理解水平代码重用的概念,而不是必须从抽象类继承.我不明白的是,使用特征与接口之间的关键区别是什么?
我已经尝试过寻找一个体面的博客文章或解释何时使用其中一个的文章,但到目前为止我发现的例子看起来非常相似.
那里的任何人都可以就此分享他们的意见/观点吗?
"Scala编程"中描述了密封类,但密封特性不是.我在哪里可以找到有关密封特性的更多信息?
我想知道,如果密封的特性与密封的类相同吗?或者,如果没有,有什么区别?何时使用密封特性(何时不是)?
Mixins和Traits有什么区别?
根据维基百科,Ruby模块有点像特征.怎么会这样?
特性是PHP 5.4的最大增加之一.我知道语法并理解特征背后的想法,比如日志,安全性,缓存等常见内容的水平代码重用.
但是,我仍然不知道如何在我的项目中使用特征.
是否有任何已经使用特征的开源项目?关于如何使用特征构建体系结构的任何好文章/阅读材料?
给定一个lambda,是否可以找出它的参数类型和返回类型?如果有,怎么样?
基本上,我想要lambda_traits
哪些可以用于以下方式:
auto lambda = [](int i) { return long(i*10); };
lambda_traits<decltype(lambda)>::param_type i; //i should be int
lambda_traits<decltype(lambda)>::return_type l; //l should be long
Run Code Online (Sandbox Code Playgroud)
背后的动机是我想lambda_traits
在一个接受lambda作为参数的函数模板中使用,我需要知道它的参数类型和函数内部的返回类型:
template<typename TLambda>
void f(TLambda lambda)
{
typedef typename lambda_traits<TLambda>::param_type P;
typedef typename lambda_traits<TLambda>::return_type R;
std::function<R(P)> fun = lambda; //I want to do this!
//...
}
Run Code Online (Sandbox Code Playgroud)
目前,我们可以假设lambda只接受一个参数.
最初,我尝试使用std::function
:
template<typename T>
A<T> f(std::function<bool(T)> fun)
{
return A<T>(fun);
}
f([](int){return true;}); //error
Run Code Online (Sandbox Code Playgroud)
但它显然会给出错误.所以我将其更改TLambda
为函数模板的版本,并希望在函数std::function
内部构造对象(如上所示).
在Java 8中使用默认方法作为穷人的特征是一种安全的做法吗?
一些人声称如果你只是为了它而使用它们可能会让熊猫感到悲伤,因为它很酷,但这不是我的意图.还经常提醒的是,引入了默认方法来支持API演变和向后兼容性,这是事实,但这并不会使它们错误或扭曲以将它们用作特征本身.
我有以下实际用例:
public interface Loggable {
default Logger logger() {
return LoggerFactory.getLogger(this.getClass());
}
}
Run Code Online (Sandbox Code Playgroud)
或许,定义一个PeriodTrait
:
public interface PeriodeTrait {
Date getStartDate();
Date getEndDate();
default isValid(Date atDate) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
无可否认,可以使用组合(甚至是辅助类),但它看起来更冗长,更混乱,并且不允许从多态性中受益.
那么,使用默认方法作为基本特征是否可行/安全,还是应该担心不可预见的副作用?
关于SO的几个问题与Java vs Scala特征有关; 这不是重点.我也不仅仅是在征求意见.相反,我正在寻找一个权威的答案或至少是现场洞察力:如果你在公司项目中使用默认方法作为特征,那么它是否真的是一个时间炸弹?