创建通用类C#的实例

时间:2019-03-17 10:36:37

标签: c# generics interface

下面是代码:

  public interface IObserver<T> where T : StackEventData<T>
    {
        void HandleEvent(StackEventData<T> eventData);
    }

    public class Observer<T> : IObserver<T> where T : StackEventData<T>, new()
    {
        public StringBuilder Log = new StringBuilder();

        public void HandleEvent(StackEventData<T> eventData)
        {
            Log.Append(eventData);
        }
    }

public class StackOperationsLogger
    {
        private readonly Observer<T> observer = new Observer<T>();
    }

我需要在StackOperationsLogger中初始化Observer观察器,而不要使StackOperationsLogger通用。有什么建议么?

2 个答案:

答案 0 :(得分:2)

提供了一些类似于以下内容的类定义:

public class StackOperationsLogger
{
    private Observer<ConcreteType> observer = new Observer<ConcreteType>();
}

您可以尝试以下方法:

ConcreteType

显然,您必须相应地设计您的课程。上面刚刚强调了类的“名称”应该是什么,以及a = ['g', 'h', 'y'] df['array']=a print(df) index col1 col2 array 0 1 a b g 1 1 r t h 2 2 e e y 类的期望值,您将定义-bad name ..您还必须对此进行更改。

答案 1 :(得分:2)

一个巨大的问题是接口的原始通用定义。

import React, { Component } from 'react';
import AddModal from './addmodal';

class Page extends Component {
  constructor() {
    super();
    this.state = {
      isModalOpen: false
    };
  }
  // ... //skip
  toggleModal = () => {
    this.setState((prevState) => ({
      isModalOpen: !prevState.isModalOpen
    }));
  };

  render() {
    return (
      <div>
        <button onClick={this.handleAdd}> Add </button>{' '}
        <AddModal
          isOpen={this.state.isModalOpen}
          toggleModal={this.toggleModal}
        />
      </div>
    );
  }
}

import React, { Component } from 'react';

class AddModal extends Component {
  // ... skip

  render() {
    return (
      <modal inOpen={this.props.isOpen}>
        <Button onClick={this.props.toggleModal}>Close</Button>
        //... skip
      </modal>
    );
  }
}

export default AddModal;

由于类型约束是递归定义的,因此您不能以所需的方式使用它。本质上,类型T必须是这样的:public interface IObserver<T> where T : StackEventData<T> 等。我认为这不是您要寻找的。

我感觉这就是您想要的。

StackEventData<StackEventData<StackEventData<StackEventData<T>>>>