我有三个简单的课程:
class A
{
public virtual void Write()
{
Console.Write("A");
}
}
class B:A
{
public override void Write()
{
Console.Write("B");
}
}
class C : B
{
public new void Write()
{
Console.Write("C");
}
}
Run Code Online (Sandbox Code Playgroud)
我正在创建对象并调用他们的方法:
A a = new A();
a.Write();
A b = new C();
b.Write();
C c = new C();
c.Write();
Run Code Online (Sandbox Code Playgroud)
输出将是: ABC
我无法理解的是这些代码产生的原因B?:
A b = new C();
b.Write();
Run Code Online (Sandbox Code Playgroud)
我认为它应该是C.但是,我测试了很多次,而且它总是如此B.
我理解A b = new C()创建C的新对象类型.所以输出应该是C.或者在我们使用它而不进行转换时调用重写方法是特殊行为? …
我正在使用EF 6并使用TPT策略来模拟我的问题.
Rule是一个抽象类.OvertimeRule是一个具体的类,继承自Rule.
Rule 看起来像这样:
public abstract class Rule
{
public int Id { get; set; }
public PeriodType PeriodType { get; set; }
public int SortOrder { get; set; }
public int StatuteId { get; set; }
public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
OvertimeRule 看起来像这样:
public partial class OvertimeRule : Rule
{
public decimal? ThresholdCoefficient { get; set; }
public decimal? LimitCoefficient { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个新的OvertimeRule并尝试保存它时,EF首先生成此查询:
INSERT [dbo].[Rules]([PeriodType], …Run Code Online (Sandbox Code Playgroud) 当我IEqualityComparer在msdn上查找通用接口时,我注意到接口是在一个单独的"comparer"类IEquatable<T>中实现的,与类本身相反.当我搜索更多的例子时,每一个都使用一个单独的类,这让我想知道:为什么不在类本身上实现它?
我能想象压倒一切object.Equals,并object.GetHashCode因为它在很多不同的情况下使用不被认为是很好的做法,但即使MSDN说(重点煤矿):
此接口允许实现集合的自定义相等性比较.
因此它的用途几乎仅限于Linq.我可以想到为什么定义一个单独的比较器类只有两个原因:
所以我的问题是:
有没有什么特别的原因让我忽略了导致每个人都只是为了比较来定义另一个comparerclass而不仅仅是在类本身上实现接口(在我看来,至少可以说这不会更糟)?
一个小例子:
public static void Main(string[] args)
{
Test t1 = new Test { id = 1, date = default(DateTime) };
Test t2 = new Test { id = 1, date = default(DateTime) };
Test t3 = new Test { id = 0, date = default(DateTime) };
List<Test> testList = new List<Test>{ t1, t2, t3 };
//Same result
int distinctCountClass …Run Code Online (Sandbox Code Playgroud) 我有一个集合,我首先需要过滤,然后从中选择一个,但是如何处理集合取决于一些参数.所以我和两位代表一起去了,但不知怎的,我应该把它们结合起来:
delegate IEnumerable<T> FilterDelegate(IEnumerable<T> collection);
delegate T SelectorDelegate(IEnumerable<T> collection, ref T previous);
//Combine above two to this one:
delegate T GetItemDelegate(IEnumerable<T> collection, ref T previous);
Run Code Online (Sandbox Code Playgroud)
我试过这样的东西,但它失败了,因为委托不是匹配的类型:
static GetItemDelegate CreateDelegate(FilterDelegate filter, SelectorDelegate select)
{
return Delegate.Combine(filter, select) as GetItemDelegate;
}
Run Code Online (Sandbox Code Playgroud)
是否可以创建一个新的委托来调用第一个委托并使用返回值作为第二个的输入参数?没有ref参数我得到它与lambdas一起工作,但当然我不能使用out或者ref然后.
namespace DelegateTest
{
interface INumericValue
{
int Number { get; }
}
class Test : INumericValue
{
public Test(int i)
{
Number = i;
}
public int Number { get; }
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个解决方案,该解决方案从ASP.Net Web页面获取输入并将输入值嵌入到MS Word文档中的相应内容控件中.MS Word文档还具有静态数据,其中一些动态数据将嵌入到页眉和页脚字段中.
这里的想法是解决方案应该基于Web.我可以将OpenXML用于此目的或您可以建议的任何其他方法.
非常感谢您提供的所有宝贵意见.我真的很感激他们.
我刚刚发现Object.defineProperty并且因为我对 C# 最熟悉,所以我想在构造函数中使用访问器属性,例如:
function Base(id) {
var _id = id;
Object.defineProperty(this,"ID",{
get: function() { return _id; },
set: function(value) { _id = value; }
})
}
function Derived(id, name) {
var _name = name;
Base.call(this,id);
Object.defineProperty(this,"Name",{
get: function() { return _name; },
set: function(value) { _name = value; }
})
}
Derived.prototype = Object.create(Base.prototype);
Derived.constructor = Derived;
var b = new Base(2);
var d = new Derived(4,"Alexander");
console.log(b.ID);
console.log(d.ID, d.Name);
d.ID = 100;
console.log(d.ID, d.Name);Run Code Online (Sandbox Code Playgroud)
这打印:
2
4 …
我有以下代码:
DECLARE
f_cd fee.fee_cd%type;
f_name fee.fee_nm%type;
f_new_cd fee.new_fee_cd%type;
f_new_name fee.new_fee_nm%type;
Cursor cur is
SELECT Fee_cd, fee_nm, new_fee_cd, new_fee_nm FROM Fee;
BEGIN
if cur%ISOPEN then
close cur;
end if;
open cur;
for rec in cur loop
fetch cur INTO f_cd, f_name, f_new_cd, f_new_name;
dbms_output.put_line ('The Fee Code ' || f_cd
|| ' is the one you selected and it''s name is '
|| f_name);
end loop;
close cur;
END;
Run Code Online (Sandbox Code Playgroud)
但我一直收到错误信息
原因: 尝试打开已打开的游标.
操作: 在重新打开之前先关闭光标.
我不知道发生了什么.当我改变代码以取消它for loop并使用loop... end loop …
有什么方法可以使用吗?
class A
{
public virtual string Greet() { return "Hello"; }
}
class B : A
{
public override string Greet() { return "Hola"; }
}
class C : A
{
public override string Greet() { return "??????"; }
}
class Greeting<T>
{
List<T> list;
public Greeting(List<T> list)
{
this.list = new List<T>();
this.list.AddRange(list);
}
public void Show()
{
foreach (T el in list)
el.Greet(); // 'T' does not contain a definition for 'Greet'
}
}
class Program
{ …Run Code Online (Sandbox Code Playgroud) c# ×6
generics ×2
inheritance ×2
asp.net ×1
compare ×1
cursor ×1
delegates ×1
for-loop ×1
javascript ×1
linq ×1
openxml ×1
openxml-sdk ×1
oracle ×1
plsql ×1
properties ×1
sql-server ×1