我最近从 Dart 2 迁移到 Dart 3,并注意到添加了类修饰符,包括接口类。它们在设置属性时工作得很好,但是当涉及到方法时,它会抛出一个错误,指出我需要将类转换为抽象类。根据逻辑,我理解接口不应该有方法体。这是一个例子:
工作正常:
interface class Foo {
late String bar;
}
Run Code Online (Sandbox Code Playgroud)
抛出 dartconcrete_class_with_abstract_member:
interface class Foo {
late String bar;
// 'getFormattedBar' must have a method body because 'Foo' isn't abstract.
// Try making 'Foo' abstract, or adding a body to 'getFormattedBar'.
// (dartconcrete_class_with_abstract_member)
String getFormattedBar();
}
Run Code Online (Sandbox Code Playgroud)
如何在 Dart 3 中声明接口方法?
我希望在接口中定义方法(当然,根据接口的定义),然后在实现类中使用各自的主体建立它们的具体实现。相反,我被迫在界面中放置一个空的主体,这没有任何意义。理想的是有这样的东西:
interface class Foo {
late String bar;
String getFormattedBar();
}
Run Code Online (Sandbox Code Playgroud) 我和一位友好的编码员发生了争执,他被Joel的Leaky Abstractions法则轻度损坏了.要说服他使用任何新的框架/工具箱是非常困难的.我试图提出一个观点,"抽象是好的,只要它们允许低级访问抽象级别".
例子:
听起来不错吗?我错过了什么吗?
谢谢
示例第一:
template <class HashingSolution>
struct State : public HashingSolution {
void Update(int idx, int val) {
UpdateHash(idx, val);
}
int GetState(int idx) {
return ...;
}
};
struct DummyHashingSolution {
void UpdateHash(int idx, int val) {}
void RecalcHash() {}
};
struct MyHashingSolution {
void UpdateHash(int idx, int val) {
...
}
void RecalcHash() {
...
UpdateHash(idx, GetState(idx)); // Problem: no acces to GetState function, can't do recursive application of templates
...
}
};
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我可以将MyHashingSolution传递给State类,因此State可以访问HashingSolution的方法,但是HashingSolution不能调用GetState.有可能解决这个问题吗?
这是最深的循环.这里的虚拟功能使性能下降超过25%.内联对我来说至关重要.
我是Ruby的新手,主要来自C#和ActionScript 3(以及其他语言).我很好奇抽象功能.具体来说,包装和抽象Ruby的FTP和SFTP库.
我在四处寻找并发现了一个名为Backup的宝石.它确实引起了我的注意,因为它支持通过S3,SCP,SFTP和FTP备份内容.所以我想,"哇,这是一个完美的例子!" 我开始浏览源代码,但后来遇到的代码如下:
case backup.procedure.storage_name.to_sym
when :s3 then records = Backup::Record::S3.all :conditions => {:trigger => trigger}
when :scp then records = Backup::Record::SCP.all :conditions => {:trigger => trigger}
when :ftp then records = Backup::Record::FTP.all :conditions => {:trigger => trigger}
when :sftp then records = Backup::Record::SFTP.all :conditions => {:trigger => trigger}
end
Run Code Online (Sandbox Code Playgroud)
它充斥着case/when语句!如果我在C#中攻击它,我会写一个Protocol接口(或抽象类),让FTP和SFTP实现它.然后我的客户端类只会传递一个Protocol实例而不关心实现.零开关/箱.
在Ruby中编码时,我会对这种情况下的最佳实践提供一些指导.
我想从控制器中提取逻辑到可能更干的地方.在Rails中处理类似以下内容的最佳方法是什么?
例如,与在控制器中进行查询相反,我可以将其放在模型中:
class SmoothieBlender < ActiveRecord::Base
belongs_to :user
def self.get_blenders_for_user(user)
self.where(["user_id = ?", user.id])
end
end
Run Code Online (Sandbox Code Playgroud)
或者将模块创建为服务层并将其包含在使用它的每个模型中会更好吗?
module BlenderUser
def get_blenders_for_user(user)
SmoothieBlender.where(["user_id = ?", user.id])
end
end
class SmoothieBlender < ActiveRecord::Base
include BlenderUser
belongs_to :user
end
class User < ActiveRecord::Base
include BlenderUser
has_many :smoothie_blenders
end
Run Code Online (Sandbox Code Playgroud)
或者只是让它成为一个完整的服务类,可以从User和Blender控制器访问?你会把这堂课放在哪里?
class BlenderService
def self.get_blenders_for_user(user)
SmoothieBlender.where(["user_id = ?", user.id])
end
end
Run Code Online (Sandbox Code Playgroud)
我是Ruby和Rails的新手,所以如果这是一个愚蠢的问题/语法不正确,请原谅我.提前致谢!
回到关于在套接字编程中使用C文件流的问题。我正在阅读它,看到评论不一-有人说这是不可靠的(即泄漏抽象?)。
有没有人对在套接字编程中使用C文件流有一种看法?
我正处于幼虫阶段,使用Python和C++中的预蛋阶段,但我正在尽我所能,特别是"不要重复自己"的原则.
我有一个多通道原始文件格式打开,主要的ascii标头,字段可表示为字符串和整数(总是编码为字符填充白色空格).第二部分是N个头部,其中N是主头部的字段,并且每个头部本身有更多的文本和数字字段(编码为ascii),指的是实际16比特多信道流的长度和大小组成文件的其余部分.
到目前为止,我在C++中有这个工作代码:
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
using namespace std;
struct Header {
string version;
string patinfo;
string recinfo;
string start_date;
string start_time;
int header_bytes;
string reserved;
int nrecs;
double rec_duration;
int nchannels;
};
struct Channel {
string label;
string transducertype;
string phys_dim;
int pmin;
int pmax;
int dmin;
int dmax;
string prefiltering;
int n_samples;
string reserved;
};
int main()
{
ifstream edf("/home/helton/Dropbox/01MIOTEC/06APNÉIA/Samples/Osas2002plusQRS.rec", ios::binary);
// prepare to read file header
Header header;
char buffer[80]; …Run Code Online (Sandbox Code Playgroud) 我想利用.NET的数据框架,但我对它们的工作原理有点困惑,我不确定我想要的是不可能的.(我已经用PHP框架做了很多这样的事情,所以我希望.NET可以做同样的事情!)简而言之,我希望我的业务逻辑与数据库无关,并且在某种意义上,我不知道这个事实是它根本就是一个数据库.
像这样的查询会让我感到恼火:
var productNames =
from p in context.Products
where seller.SellerID == mySeller.SellerID
select p.Name;
Run Code Online (Sandbox Code Playgroud)
相反,我想做:
var productNames =
from p in context.Products
where seller == mySeller
select p.Name;
Run Code Online (Sandbox Code Playgroud)
本质上,我希望我的业务逻辑不关心 ID映射.部分地,这是因为在几个表中,ID具有实际意义.(我正在使用的一些表是从另一个应用程序域导入的,我需要能够直接使用这些ID,但对于我自己的类型,这些ID是偶然的.)
这是示例中的一个小点,但总的来说,我希望能够完全在对象世界中工作,或多或少地忘记底层数据库的现实.这只是为我的类定义等价运算符的问题吗?
总结:什么.NET数据框架为我提供了对象世界最干净的数据库抽象?
我正在设计一款游戏,我对自己的工作有很好的了解.
然而,我一直在努力提高我的OOP技能但是我现在面对同样的问题,我应该如何使用抽象的对象?
让我说我有一个实体列表,代表屏幕上有x和y属性的任何东西,可能宽度和高度还没有完全搞清楚!
然后我有特殊类型的实体,一个可以移动,一个不能,也可能是将来可以碰撞的东西.
它们都在实体集合中(List<Entity>在我的例子中),现在我想模拟移动的实体并且是主循环上的DynamicEntity实例,但它们都在实体的抽象列表上,我不知道是实体在循环中是否是动态实体.
我知道我可以检查一下,instanceof但我很确定这不是最好的主意.
我已经看到有些人在实体中有类似布尔值的东西来检查它的类型,但我真的不想硬编码所有类型的实体.
我只是想知道这种情况下的最佳做法是什么?
我正在尝试编写一个使用外部工具的日志库
我正在寻找方便的方法将键字符串添加到输出流,以帮助外部工具解析,同时使用库对程序员的影响最小
目标是实现这样的目标:
cout << DEBUG::VERBOSE << "A should equal 3" << endl;
cout << DEBUG::WARNING << "something went wrong" << endl;
Run Code Online (Sandbox Code Playgroud)
现在,我将数据结构如下
struct Debug
{
static const std::string FATAL_ERROR;
static const std::string ERROR;
static const std::string WARNING;
static const std::string IMPORTANT;
static const std::string INFORMATION;
static const std::string VERBOSE;
static const std::string DEBUG;
};
Run Code Online (Sandbox Code Playgroud)
这个工作找到但我想从std::string类型中添加一个抽象级别.
在Java/C#中我可以用a enum来实现写行为,我怎样才能在C++中优雅地实现它.