代码之家  ›  专栏  ›  技术社区  ›  Tony

这个C代码是什么?

f#
  •  0
  • Tony  · 技术社区  · 6 年前

    当我在C语言开始时,我使用了VB.NET,有一个代码翻译站点。给F买这个就好了#

    我写了这个密码

    public interface IData : INotifyPropertyChanged
    {
        Guid ID { get; set; }
    }
    public interface IVertex : INotifyPropertyChanged
    {
    }
    public abstract class Vertex<IData>
    {
        public IData Properties { get; set; }
    
        public Vertex()   {   }
        public Vertex(IData Properties)
        {
            this.Properties = Properties ;
        }
    
        public string Tipo { get { return typeof(IData).Name; } }
    }
    public class Data_Person : IData
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        public Guid ID { get; set; } = Guid.NewGuid();
        public decimal Balance { get; set; }
        public string Name { get; set; }
    }
    public class Person : Vertex<Data_Person>, IVertex
    {
        public Person()
        {
            this.Properties = new Data_Person();
        }
        public Person(Data_Person Properties) : base(Properties)
        {  }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    
    public class EdgeLink<ISourceVertex, IEdgeData, ITargetVertex>
    {
        public EdgeLink()
        {        }
        public EdgeLink(ISourceVertex In, IEdgeData Edge, ITargetVertex Out)
        {
            this.In = In;
            this.Properties = Edge;
            this.Out = Out;
        }
    
        public ISourceVertex In { get; set; }
        public IEdgeData Properties { get; set; }
        public ITargetVertex Out { get; set; }
    
        //public LoadStatus LoadStatus { get; set; } = LoadStatus.Uknown;
    }
    

    我试着做同样的事情,但是在F。

    如何将此“翻译”为f?

    我试着翻译,但结果搞砸了

    type IData = 
        inherit INotifyPropertyChanged
        abstract member ID: Guid with get, set
    
    type IEdgeData = 
        inherit IData
    
    type IVertex =
        inherit INotifyPropertyChanged
    
    type ISourceVertex =
        inherit IVertex
    
    type ITargetVertex = 
        interface 
            inherit IVertex
        end
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Aaron M. Eshbach    6 年前

    由于注释表明您在处理事件和泛型类型时遇到问题,下面是您将如何转换这些类型的方法,特别是:

    open System
    open System.ComponentModel
    
    type IData =
        inherit INotifyPropertyChanged
        abstract member ID: Guid
    
    type IVertex = inherit INotifyPropertyChanged
    
    [<AbstractClass>]
    type Vertex<'data when 'data :> IData> (properties: 'data) =
        member __.Properties = properties
        member __.Tipo = typeof<'data>.Name
    
    type DataPerson (id, balance, name) =
        let propertyChanged = Event<_,_>()
        member __.ID = id
        member __.Balance = balance
        member __.Name = name
        interface IData with
            member __.ID = id
            [<CLIEvent>]
            member __.PropertyChanged = propertyChanged.Publish
    

    您只需要一个泛型类型变量 'data 被迫成为 IData 对于 Vertex 等级和F# Event<_,_> 具有 PropertyChanged 事件。

    注意,这里没有设置属性。如果你真的需要的话,你可以很容易地把它们加回去。

    编辑

    添加Person类:

    type Person (person) =
        inherit Vertex<DataPerson>(person)
        let propertyChanged = Event<_,_>()
        interface IVertex with
            [<CLIEvent>]
            member this.PropertyChanged = propertyChanged.Publish
    

    编辑2

    在构造函数中添加可选参数(我也做了 Vertex.Properties 这个属性是可变的,因为如果你可以用它初始化实例化类,那么保持它不可变是没有多大意义的。我可能不会在PURE F的解决方案中这样做,但是这是对原始C代码的更直接的表示:

    [<AbstractClass>]
    type Vertex<'data when 'data :> IData> (?properties: 'data) =
        let vertexProperties = defaultArg properties Unchecked.defaultof<'data>
        member val Properties = vertexProperties with get,set
        member __.Tipo = typeof<'data>.Name
    
    type DataPerson (id, balance, name) =
        let propertyChanged = Event<_,_>()
        member __.ID = id
        member __.Balance = balance
        member __.Name = name
        interface IData with
            member __.ID = id
            [<CLIEvent>]
            member __.PropertyChanged = propertyChanged.Publish
    
    type Person (?person) =
        inherit Vertex<DataPerson>(defaultArg person Unchecked.defaultof<DataPerson>)
        let propertyChanged = Event<_,_>()     
        interface IVertex with
            [<CLIEvent>]
            member this.PropertyChanged = propertyChanged.Publish