- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个继承自泛型 List<T>
的类类(class):
Class MyList::List<MyClass>
List<T>::Item[Int32]
indexer 属性在我的一种方法中,但我不知道该怎么做。
List<MyClass>::[i]
和
List<MyClass>::Item[i]
,但两者都不起作用。
List<MyClass>
调用其他方法,例如
Add
,我可以做
List<MyClass>::Add(myInstance)
.
最佳答案
从 List<T>.Item[Int32]
是一个默认的索引器,你可以做 this[i]
.例如:
public ref class MyList : System::Collections::Generic::List<MyClass ^>
{
public:
int CountNonNull();
};
int MyList::CountNonNull()
{
int nonNull = 0;
for (int i = 0; i < Count; i++)
{
if (this[i] != nullptr)
nonNull++;
}
return nonNull;
}
default[i]
明确:
if (this->default[i] != nullptr)
nonNull++;
List<MyClass ^>::default[i]
也是有效的,可用于在覆盖索引器本身时调用基本索引器。
List<T>.Item[Int32]
默认索引器:
I intend to implement a class that stores a list of images. Depending on some conditions, my indexer would either return the raw image or a processed image.
List<T>
继承因为
List<T>.Item[Int32]
是
非虚拟 并且不打算被覆盖。因此,您只能通过
interface re-implementation 隐藏它。 .但这会使您的应用程序面临一个可能的错误:如果您的
MyList
永远向上转换为基类
List<MyClass ^>
,则不会调用替换索引器。更糟糕的是,似乎
List<T>.GetEnumerator()
返回的枚举数不会调用您的替换索引器,因此只需遍历
MyList
将导致退回未处理的元素。
ref class MyList;
public ref class MyClass
{
public:
property bool Processed;
};
public ref class MyList : List<MyClass ^>, IList<MyClass ^>
{
public:
// default indexer
virtual property MyClass^ default[int]
{
MyClass^ get(int index) new = IList<MyClass ^>::default::get // hiding + interface reimplementation of default::get method
{
MyClass^ item = List<MyClass ^>::default[index]; // Call base default indexer
item = ProcessItem(item); // Add your custom logic here
return item; // return the item
}
void set(int index, MyClass^ value) new = IList<MyClass ^>::default::set // hiding + interface reimplementation of default::set method
{
List<MyClass ^>::default[index] = value; // Call base default indexer
}
}
private:
MyClass^ ProcessItem(MyClass ^item)
{
// Add your custom logic here
if (item != nullptr)
item->Processed = true;
return item;
}
};
get
方法调用
ProcessItem()
在退回之前进行处理。 (您的图像处理将在此处进行;在示例中,
bool
设置为
true
。)
MyList ^list = gcnew MyList();
list->Add(gcnew MyClass());
for each (MyClass^ item in list)
Debug::Assert(item->Processed); // FAILS because enumerator doesn't call indexer!
list->Add(gcnew MyClass());
Debug::Assert(list[list->Count-1]->Processed); // Passes because re-implemented Add() was called.
// Upcast to base class
List<MyClass ^>^ baseList = list;
baseList->Add(gcnew MyClass());
Debug::Assert(baseList[list->Count-1]->Processed); // FAILS because re-implemented Add() was NOT called!
// Upcast to interface
IList<MyClass ^>^ iList = list;
iList->Add(gcnew MyClass());
Debug::Assert(iList[iList->Count-1]->Processed); // Passes because re-implemented Add() was called.
get()
方法没有被调用。这真的是无法避免的;通过
new
重新实现接口(interface)关键字实际上并没有覆盖基本实现,它在 vtable 中创建一个带有新插槽的新实现。见:
new (new slot in vtable) (C++/CLI and C++/CX) .
System.Collections.ObjectModel.Collection<T>
继承它提供了 protected 虚拟方法,每当从集合中添加或删除项目时都会调用这些方法。 (这是
ObservableCollection<T>
的基类。)
MyList
如下:
public ref class MyList : Collection<MyClass ^>
{
protected:
virtual void InsertItem(int index, MyClass ^ item) override
{
Collection<MyClass ^>::InsertItem(index, ProcessItem(item));
}
virtual void SetItem(int index, MyClass ^ item) override
{
Collection<MyClass ^>::InsertItem(index, ProcessItem(item));
}
private:
MyClass^ ProcessItem(MyClass ^item)
{
// Add your custom logic here
if (item != nullptr)
item->Processed = true;
return item;
}
};
MyList ^list = gcnew MyList();
list->Add(gcnew MyClass());
for each (MyClass^ item in list)
Debug::Assert(item->Processed); // Passes
list->Add(gcnew MyClass());
Debug::Assert(list[list->Count-1]->Processed); // Passes
// Upcast to base class
Collection<MyClass ^>^ baseList = list;
baseList->Add(gcnew MyClass());
Debug::Assert(baseList[list->Count-1]->Processed); // Passes
// Upcast to interface
IList<MyClass ^>^ iList = list;
iList->Add(gcnew MyClass());
Debug::Assert(iList[iList->Count-1]->Processed); // Passes
get()
方法,您可以使用
decorator pattern并创建自己的自定义集合实现
List<MyClass ^
> 包装底层
List<MyClass ^>
并在其自己的默认索引器、枚举器
CopyTo()
中进行必要的处理以及根据需要访问项目的其他方法:
public ref class MyList : IList<MyClass ^>
{
private:
List<MyClass ^> list;
public:
MyList()
{
list = gcnew List<MyClass ^>();
}
virtual property MyClass^ default[int]
{
MyClass^ get(int index)
{
MyClass^ item = list[int];
item = ProcessItem(item); // Add your custom logic here
return item;
}
void set(int index, MyClass^ value)
{
list[index] = value;
}
}
// Implement all other methods as required.
virtual property int Count { int get() { return list->Count; } }
// Etc
};
关于c++-cli - 如何在 c++/cli 中调用基类索引器属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365870/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!