我最近一直在考虑Liskov替换原则以及它与我当前任务的关系.我有一个包含菜单的主表单; 在这个主要表单中,我将一个特定的表单作为MDI子对接.此特定表单可能包含也可能不包含菜单.如果是,我想将它与主菜单合并.所以情况是这样的:
public class MainForm
{
public void Dock(SpecificBaseForm childForm)
{
this.Dock(childForm);
if (childForm is IHaveMenu)
{
this.Menu.Merge(childForm as IHaveMenu).Menu;
}
}
}
public interface IHaveMenu
{
Menu Menu {get;}
}
public abstract class SpecificBaseForm{}
public class SpecificFormFoo : SpecificBaseForm {}
public class SpecificFormBar: SpecificBaseForm,IHaveMenu
{
public Menu Menu{get {return this.Menu;}}
}
Run Code Online (Sandbox Code Playgroud)
现在这两个孩子并不是"完全"可互换的:一个有菜单; 另一个没有.这是在C#中误用is/as contruct吗?如果这不正确,那么干净的解决方案是什么?
c# design-patterns single-responsibility-principle design-principles solid-principles
我正在实现REST Web API.我使用Adam Freeman的Pro ASP.NET MVC5中的示例作为起点,但将其调整为Web API的方式.
以下是我的代码:
public class AdminController : ApiController
{
private IUserRepository _repository;
public AdminController(IUserRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
return View(_repository.Users);
}
}
Run Code Online (Sandbox Code Playgroud)
在本书中,没有AdminController实现,但如果我这样做,那么我会得到关于没有无参数构造函数的错误.我需要构造函数来获取参数,以便我可以注入依赖项.所以这就是我改变的原因,但现在却无法识别.ControllerApiControllerApiControllerView
我需要做什么来代替使用View一个ApiController?
我确实找到了这个问题,但答案基本上是"你不需要在这里使用ApiController,只需使用Controller",这样就没有帮助我.
所以今天我认为(int foo()事实上第一次)实际上不同于int foo(void)第一个允许任意数量的输入而第二个允许零.
是否int foo()只是忽略任何给定的输入?如果是这样,那么允许这种形式的功能有什么意义呢?如果没有,你怎么能访问它们,这与变量参数列表(例如类似的东西int foo (int argc, ...))有何不同?
那么根据Stack Overflow的一些问题答案,我已经读到了在循环中使用对象声明,比在它之外做它更好,性能方面.
我无法理解为什么,因为当我在循环中使用声明时,我的软件使用更多的RAM,然后是循环外的声明.
while (true) {
String hey = "Hello.";
}
Run Code Online (Sandbox Code Playgroud)
拉姆使用量:1820kb
String hey;
while (true) {
hey = "Hello.";
}
Run Code Online (Sandbox Code Playgroud)
拉姆使用量:1720kb
为什么人们说我应该使用第一个循环导致它的性能更好,但是它从RAM中使用了100kb?
我想编写一个程序来获取我创建的文件和文件夹的详细信息,包括创建日期,如下所示:2006年2月15日我该怎么办?有什么建议吗?我不得不提到,我不允许使用windows.h。
我试图理解c ++中的const.我在下面的代码片段中写了这个:
const int x=5;
int *ptr;
ptr=(int*)&x;
cout<<"address of x="<<&x<<endl;
cout<<"value of ptr="<<ptr<<endl;
*ptr=11;
cout<<"*ptr="<<*ptr<<endl;
cout<<"x="<<x;
Run Code Online (Sandbox Code Playgroud)
输出是
address of x=0x28fef8
address of ptr=0x28fef8
*ptr=11
x=5
Run Code Online (Sandbox Code Playgroud)
由于ptr指向x,我确信*ptr和x的值是相同的.为什么价值不同?我知道x是const,但是,我通过执行*ptr来改变内存地址的值.请告诉我我错过了什么.
在一台64位的linux机器上,我编写了以下小型C程序:
#include <stdlib.h>
#include <stdio.h>
int main (void)
{
#define BLOCK_SIZE (1024*1024)
int i;
for (i = 1; ; i++)
{
char *p = (char *)malloc(i * BLOCK_SIZE);
if (p == 0)
break;
*p = 13;
free(p);
}
printf ("Allocated max %d MB\n", (i - 1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我编译它-O0 -m64,我可以在我的桌面系统上分配2047 MB.如果我使用-O0 -m323829 MB 编译相同的程序.
为什么32位二进制文件的最大malloc大小比同一台机器上的64位二进制文件大?
编辑:如果我激活优化器-O3,64位机器上的最大内存量为20588.
不知道这怎么会变得不稳定.这在大多数情况下都可以正常工作,但是会抛出IllegalArgumentException和一些查询.
这就是全部,想不出更多相关细节.
private static void sortSearchResults(List<Map> l){
Comparator<Map> comp = new Comparator<Map>(){
public int compare(Map a,Map b){
int aa=0,ba=0,as=0,bs=0;
try{
aa = Integer.parseInt(""+a.get("activity"));
}catch(Exception ex){
}
try{
ba = Integer.parseInt(""+b.get("activity"));
}catch(Exception ex){
}
try{
as = Integer.parseInt(""+a.get("searchscore"));
}catch(Exception ex){
}
try{
bs = Integer.parseInt(""+b.get("searchscore"));
}catch(Exception ex){
}
if(as>bs)
return -1;
else if(bs<as)
return 1;
else{
if(aa>ba)
return -1;
else if(aa<ba)
return 1;
else
return 0;
}
}
public boolean equals(Object o){
return o==this;
}
};
Collections.sort(l,comp);
}
Run Code Online (Sandbox Code Playgroud) 我有一个关于将斐波那契序列列入清单的问题,我只是陌生人,请有人帮助我.
这是我的代码.我知道这看起来有点不对劲,因为它说的语法无效.我真的不知道该怎么办:(
此代码适用于普通代码而不使用列表!
myArray1 = [0]
myArray2 = [1]
while myArray2 < 700:
myArray1, myArray2 = b[i], myArray1+myArray2[i]
print(myArray2)
Run Code Online (Sandbox Code Playgroud) c# ×3
c ×2
c++ ×2
java ×2
arguments ×1
asp.net ×1
comparator ×1
const ×1
controller ×1
exception ×1
fibonacci ×1
file ×1
linux ×1
list ×1
malloc ×1
performance ×1
python ×1
scope ×1